题意:
给你一个数,你弄够任意调换数的位置,最后让你输出能被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;
}