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
最后构建的数一定可以作为一个三位数,除非位数不够,或者根本不能构造
点击打开链接
题目大意:
给出一个数,问拿走某几位,能否使这个数被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; }