轻松周赛赛题:能否被8整除
题目详情
给定一个非负整数,问能否重排它的全部数字,使得重排后的数能被8整除。
输入格式:
多组数据,每组数据是一个非负整数。非负整数的位数不超过10000位。
输出格式
每组数据输出一行,YES或者NO,表示能否重排它的全部数字得到能被8整除的数。注意: 重排可以让0开头。
答题说明
输入样例
610
122
输出样例
YES
NO
解释
第一个数可以变为016 , 160
解题:很水的一道题。。。思路很简单,1000是能被8整除的,所以一千的倍数都能被8整除,假设输入的大数为x,把x分解成x = a*1000+b
很明显a*1000能够被8整除,所以只要判断b能不能被8整除即可。
三位数能够被8整除的直接枚举就可以了。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <climits> 7 #include <vector> 8 #include <queue> 9 #include <cstdlib> 10 #include <string> 11 #include <set> 12 #include <stack> 13 #define LL long long 14 #define pii pair<int,int> 15 #define INF 0x3f3f3f3f 16 using namespace std; 17 const int maxn = 10010; 18 char str[maxn]; 19 int cnt[10],table[200][10],len,tot; 20 bool vis[maxn]; 21 bool dfs(int sum,int d,int cur){ 22 if(cur >= d) return sum%8 == 0; 23 for(int i = 0; i < len; ++i){ 24 int tmp = str[i] - '0'; 25 if(!vis[i]){ 26 vis[i] = true; 27 if(dfs(sum*10 + tmp,d,cur+1)) return true; 28 vis[i] = false; 29 } 30 } 31 return false; 32 } 33 void create(){ 34 memset(table,0,sizeof(table)); 35 for(int i = tot = 0; i<<3 < 1000; ++i){ 36 int db = 0,tmp = i<<3; 37 while(tmp){ 38 int u = tmp%10; 39 table[tot][u]++; 40 tmp /= 10; 41 db++; 42 } 43 table[tot++][0] += 3 - db; 44 } 45 } 46 bool check(){ 47 int i,j; 48 memset(cnt,0,sizeof(cnt)); 49 for(i = 0; i < len; ++i) cnt[str[i]-'0']++; 50 for(i = 0; i < tot; ++i){ 51 for(j = 0; j < 10; ++j) 52 if(cnt[j] < table[i][j]) break; 53 if(j == 10) return true; 54 } 55 return false; 56 } 57 int main() { 58 create(); 59 while(~scanf("%s",str)){ 60 len = strlen(str); 61 if(len <= 3){ 62 memset(vis,false,sizeof(vis)); 63 if(dfs(0,len,0)) puts("YES"); 64 else puts("NO"); 65 }else if(check()) puts("YES"); 66 else puts("NO"); 67 } 68 return 0; 69 }