题意:给出n个数字,其中一定包含数字1,6,8,9.问是否能用这些数字组成一个数x 使得x被7整除. n<=1e6.
能被7整除的数特征:末尾三位以前的数-末尾三位能被7整除.本题好像不能用上.
a≡r(mod 7) b≡7-r(mod7) -> a+b≡0(mod7)
因为一定有1689 把这4个数提出来 其余的数随便排列 假如此时余数为r.
现在添加(1000*a+100*b+10*c+d) 有4!种添加方案. 打表得这4!种方案都有0~6这7个余数.选7-r的哪一种即可
能被7整除的数特征:末尾三位以前的数-末尾三位能被7整除.本题好像不能用上.
a≡r(mod 7) b≡7-r(mod7) -> a+b≡0(mod7)
因为一定有1689 把这4个数提出来 其余的数随便排列 假如此时余数为r.
现在添加(1000*a+100*b+10*c+d) 有4!种添加方案. 打表得这4!种方案都有0~6这7个余数.选7-r的哪一种即可
注意:如果提出来后只剩下前导0 则当前余数为0后,将0放在后面即可.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
char s[N];
int a[]={1,6,8,9};
vector<int> v[10];
void init()
{
do{
string t;
int res=0,fac=1000;
for(int j=0;j<4;j++)
res+=fac*a[j],fac/=10,t+=(char)a[j];
res%=7;
v[res].clear();
for(int j=0;j<4;j++)
v[res].push_back(a[j]);
}while(next_permutation(a,a+4));
}
int cnt[N];
int main()
{
init();
scanf("%s",s+1);
for(int i=1;s[i];i++)
cnt[s[i]-'0']++;
cnt[1]--,cnt[6]--,cnt[8]--,cnt[9]--;
int r=0,num=0;
for(int i=1;i<10;i++)
{
for(int j=0;j<cnt[i];j++)
printf("%d",i),r=(r*10+i)%7,num++;
}
r=(r*10000)%7;
for(int i=0;i<4;i++)
printf("%d",v[(7-r)%7][i]);
for(int i=0;i<cnt[0];i++)
printf("0"),r=(r*10)%7;
return 0;
}