Divisible by Seven CodeForces - 375A

原题链接
考察:数论(?)
思路:
  一开始还以为是背包什么的,结果数字有规律....\(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;
}
posted @ 2021-07-30 10:07  acmloser  阅读(45)  评论(0编辑  收藏  举报