#include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <string> #include <vector> #include <queue> #define N 1000010 //CF221 Div2 (C) 构造一个数能整除7,并且这个数必定含有1,6,8,9这四个数(这就决定肯定存在这个数----因为这四个数所构造的数取余能涉及到0~6的数。 using namespace std; //解题思路:最前面是由剩余下来的1~9随便组合的数(因为前面无论怎么组合,我们只需要它%7得到的数,接下来就只需要根据前面取余的数再取相对应的数组mod里的数,0只需要都放在所构造的数后面。 int a[10], mod[7], b[4]={1, 6, 8, 9}, vis[4]; void dfs(int x, int k) //dfs深搜,由1,6,8,9四个数组成的数(只需要一个就行)放进mod数组内,其实也可以自己枚举 { if(k==4) { mod[x%7]=x; return ; } int t; for(t=0; t<4; ++t) { if(!vis[t]) { vis[t]=1; dfs(x*10+b[t], k+1); vis[t]=0; } } return ; } int main() { int t, j, k; char p[N]; dfs(0, 0); while(scanf("%s", p)!=EOF) { j=strlen(p); memset(a, 0, sizeof(a)); for(t=0; t<j; ++t) { a[p[t]-'0']++; } a[1]--; a[6]--; a[8]--; a[9]--; k=0; for(j=1; j<=9; ++j) { for(t=1; t<=a[j]; ++t) { printf("%d", j); k=k*10+j; //这行包括下面一行是大数取余的操作 k%=7; } } k=k*10000%7; //注意这里还要预先操作后面的四位数 if(!k) printf("%d", mod[0]); else printf("%d", mod[7-k]); for(t=0; t<a[0]; ++t) printf("0"); printf("\n"); } return 0; }
CF221 Div2 (C)
最新推荐文章于 2022-03-11 18:57:57 发布