您的位置:首页 > 其它

codeforces #306 550C C. Divisibility by Eight(同余模定理+枚举)

2015-06-22 21:30 330 查看
题目链接:

点击打开链接

题目大意:

给出一个数,问拿走某几位,能否使这个数被8整除(可以选择全部留下)

题目分析:

这道题主要考对同余模定理的理解,整个数mod8

首先看对于第i位上来说相当于 10^(i-1)*digit%8,当i>3时,10^3*10^(i-4)%8 = 0*10^(i-4) = 0

所以只考虑三位数的情况即可,1%8 = 1 , 10%8 = 2 , 100%8 = 4

那么因为取走数之后相对顺序不变,所以我们只需要枚举这三个数,取自哪几位即可,然后判断是否相加取模为0

最后构建的数一定可以作为一个三位数,除非位数不够,或者根本不能构造

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MAX 107

using namespace std;

int num[MAX];
char s[MAX];

int main ( )
{
    scanf ( "%s" , s ) ;
    int len = strlen(s);
    for ( int i = 0 ; i < len ; i++ )
        num[s[i]-'0']++;
    if ( num[8] ) 
    {
        puts ( "YES" );
        puts ( "8" );
        return 0;
    }
    if ( num[0] )
    {
        puts( "YES" );
        puts( "0" );
        return 0; 
    }
    if ( len == 1 )
    {
        puts("NO");
        return 0;
    }
    for ( int i = len-1 ; i > 0  ; i-- )
        for ( int j = i-1 ; j >= 0 ; j-- )
        {
           int num1 = s[i]-'0';
           int num2 = s[j]-'0';
           if ( (num1*1 + num2*2)%8 == 0 ) 
           {
               puts("YES" );
               printf ( "%d%d\n" , num2 , num1 );
               return 0;
           }
        }
    if ( len == 2 )
    {
        puts("NO");
        return 0;
    }
    for ( int i = len-1 ; i >= 0 ; i-- )
        for ( int j = i-1 ; j >= 0 ; j-- )
            for ( int k = j-1; k >= 0 ; k-- )
            {
                int num1 = s[i]-'0';
                int num2 = s[j]-'0';
                int num3 = s[k]-'0';
                if ( (num1*1 + num2*2 + num3*4)%8 == 0 )
                {
                    puts("YES");
                    printf ( "%d%d%d\n" , num3,num2,num1);
                    return 0;
                }
            }
    puts("NO");
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: