点击打开链接
题意:
给你一个数,你弄够任意调换数的位置,最后让你输出能被7整除的组合形式。
题解:
给你的数最少四位,还必有1,6,8,9;
所以一定能构造成功,
然后发现
x=a+b;
x%7 =(a%7+b%7)%7;
而mod7 的结果无非是 0——6.
那么枚举出 (0-6)和{1,6,8,9} 能组合成的mod7==0 的数,
然后有0 加后面,非零加前面就好了。
#include <stdio.h> #include <string.h> #include <iostream> #include <map> #include <math.h> #define LL long long using namespace std; const int maxn=1e6+10; const int mod=1e9+7; char a[maxn]; int s[4]={1,6,8,9}; int v[222]; char ss[8][5]={"1869","6198","1896","1689","1986","1968","1698"}; int main(){ // for(int i=0;i<7;++i){ // int wan=i*10000; // for(int j=0;j<4;++j){ // int qian=s[j]*1000; // for(int k=0;k<4;++k){if(k==j) continue; // int bai=s[k]*100; // for(int l=0;l<4;++l){if(l==j||l==k) continue; // int shi=s[l]*10; // for(int q=0;q<4;++q){if(q==k||q==j||q==l) continue; // int w=wan+qian+bai+shi+s[q]; // if(w%7==0) printf("%d ",w); // } // } // } // } // } scanf("%s",a); int len=strlen(a); int t=0,cnt=0; for(int i=0;i<len;++i){ if(a[i]=='0') cnt++; else if((a[i]=='1'||a[i]=='6'||a[i]=='8'||a[i]=='9')&&!v[a[i]]) v[a[i]]=1; else { t=t*10+a[i]-'0'; t%=7; printf("%c",a[i]); } } printf("%s",ss[t]); for(int i=0;i<cnt;++i) printf("0"); puts(""); return 0; }