原题链接
考察:数论(?)
思路:
??一开始还以为是背包什么的,结果数字有规律....\(1689\)的排列可以组成0~6的余数.剩下的数字我们随意拼即可.\(0\)直接全部放末尾.不存在没有数字的情况.
Code
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1000010,M = 10;
char s[N];
int len,tmp[M] = {1869,1968,1689,6198,1698,1986,1896},cnt[M];
void solve()
{
cnt[6]--,cnt[1]--,cnt[8]--,cnt[9]--;
int r = 0,pos = 0;
for(int i=1;i<10;i++)
while(cnt[i])
{
r = (r*10+i)%7;
s[++pos] = i+‘0‘;
cnt[i]--;
}
r=r*10000%7;
int t = tmp[(7-r)%7],p = 1000;
while(p)
{
char c = t/p+‘0‘;
s[++pos] = c;
t%=p;
p/=10;
}
while(cnt[0])
{
s[++pos] = ‘0‘;
cnt[0]--;
}
printf("%s\n",s+1);
}
int main()
{
scanf("%s",s+1);
len = strlen(s+1);
for(int i=1;i<=len;i++)
cnt[s[i]-‘0‘]++;
solve();
return 0;
}