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

来源:互联网 发布:矩阵有没有分配律 编辑:程序博客网 时间:2024/04/30 11:43

题目链接:

点击打开链接

题目大意:

给出一个数,问拿走某几位,能否使这个数被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 107using 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;}


0 0