CodeForces 550C Divisibility by Eight(枚举)

题目链接click here~~

题目大意

给一个不超过100位的数字,要求能否删掉几位数,剩下的数能被8整除

解题思路】:这里有个性质:如果一个数后三位能被8整除,那么这个数就能被8整除

证明:举一个5位数的例子吧,

例如

_____  _____  __              __  __                __  ___

abcde=ab000+cde=1000×ab+cde=8×125×ab+cde

很明显,8×125×ab一定是8或者125的倍数,因此当cde能被8或者125整除时,五位数abcde就能被8或者125整除。位数再多也是一样的,主要是1000=125*8

那么只要枚举后三位即可

代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    char str[110];
    while(cin>>str)
    {
        bool ok=false;
        int len=strlen(str);
        for(int i=0; i<len; ++i)
        {
            if((str[i]-'0')%8==0)
            {
                puts("YES");
                cout<<(str[i]-'0')<<endl;
                return 0;
            }
        }
        for(int i=0; i<len; ++i)
        {
            for(int j=i+1; j<len; ++j)
            {
                if(((str[i]-'0')*10+(str[j]-'0'))%8==0)
                {
                    puts("YES");
                    cout<<((str[i]-'0')*10+(str[j]-'0'))<<endl;
                    return 0;
                }
            }
        }
        for(int i=0; i<len; ++i)
        {
            for(int j=i+1; j<len; ++j)
            {
                for(int k=j+1; k<len; ++k)
                {
                    if(((str[i]-'0')*100+(str[j]-'0')*10+str[k]-'0')%8==0)
                    {
                        puts("YES");
                        cout<<((str[i]-'0')*100+(str[j]-'0')*10+str[k]-'0')<<endl;
                        return 0;
                    }
                }
            }
        }
        puts("NO");
    }
}

官方题解是用dp,麻烦一些。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 09:39:05

CodeForces 550C Divisibility by Eight(枚举)的相关文章

CodeForces - 550C Divisibility by Eight

题意:给你一串数问你能不能选几个数组合起来的数被8整除 思路:位数很小,所以直接暴力就好了,判断能不能被8整除是看一个数的后三位,至于为什么要写这篇题解呢,是因为wa了一发,看了其他人的题解,学到了一些东西,就是在字符串读入的时候可以向后扩几位,把前面补为0,这样就不用考虑低于3位的情况,这方法真聪明. 代码: #include <bits/stdc++.h> using namespace std; char a[1005]; int main() { while(~scanf("

Educational Codeforces Round 76 F 折半枚举

Educational Codeforces Round 76 F 折半枚举 https://codeforces.com/contest/1257/problem/F 题意: 数组a,找到一个x使得a中每一个元素异或x后"二进制中1的个数"相同. 数组长度100,数字大小2^30. 思路: 折半枚举答案X,如分为X前15位和后15位.之后我们再枚举期望的"相同个数"是多少,通过hash看看能不能满足就好了. 代码: #include <bits/stdc++

Codeforces Gym 100002 B Bricks 枚举角度

Problem B Bricks" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100002 Description The prisoner of the "IF" castle has decided to run away by disassembling the brick wall in his prison cell. To hide his work from his

[codeforces 200 E Tractor College]枚举,扩展欧几里得,三分

题目出自 Codeforces Round #126 (Div. 2) 的E. 题意大致如下:给定a,b,c,s,求三个非负整数x,y,z,满足0<=x<=y<=z,ax+by+cz=s,使得f(x,y,z)=|ax-by|+|by-cz|最小 思路:枚举z,得到一个方程ax+by=s-cz,用扩展欧几里得求出这个方程的一个解,然后三分通解的整系数,求出最小f值.至于为什么可以三分画画图就清楚了,两个绝对值函数叠加在一起最多只有三种状态(第一维表示临界点较小的那个绝对值函数):(降,降)

Codeforces 922F Divisibility 构造

Divisibility 我们考虑删数字 首先我们可以发现有一类数很特殊就是大于 n / 2的素数, 因为这些素数的贡献只有1, 并且在n大的时候, 这些素数的个数不是很少, 我们可以最后用这些数去调整, 并且删掉一个数的时候删掉的是它的因子个数, 所以可以用素数去控制最后的数量.当n小的时候直接状压枚举. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk mak

Codeforces C. Maximum Value(枚举二分)

题目描述: Maximum Value time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given a sequence a consisting of n integers. Find the maximum possible value of (integer remainder of *a**i* divi

codeforces 493C Vasya and Basketball (枚举+模拟+思维)

C. Vasya and Basketball time limit per test 2 seconds memory limit per test 256 megabytes Vasya follows a basketball game and marks the distances from which each team makes a throw. He knows that each successful throw has value of either 2 or 3 point

Codeforces 526A King of Thieves 枚举

题意:问你有没有一个字符串里面5个间隔相同且值都为 '*' 的情况. 解题思路:枚举 解题代码: 1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月05日 星期日 00时33分59秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque>

CodeForces 496D Tennis Game (暴力枚举)

题意:进行若干场比赛,每次比赛两人对决,赢的人得到1分,输的人不得分,先得到t分的人获胜,开始下场比赛,某个人率先赢下s场比赛时, 游戏结束.现在给出n次对决的记录,问可能的s和t有多少种,并按s递增的方式输出. 析:如果枚举s 和 t,那么一定会超时的,所以我们考虑是不是可以不用全枚举.我们只要枚举 t ,然后每次都去计算 s. 首先我们先预处理两个人的获得第 i 分时是第几场比赛.然后每次枚举每个 t,每次我们都是加上t,所以总的时间复杂度为 n*logn. 完全可以接受,注意有几个坑,首先