CF221 Div2 (C)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#define N 1000010   //CF221 Div2 (C)  构造一个数能整除7,并且这个数必定含有1,6,8,9这四个数(这就决定肯定存在这个数----因为这四个数所构造的数取余能涉及到0~6的数。
using namespace std;
//解题思路:最前面是由剩余下来的1~9随便组合的数(因为前面无论怎么组合,我们只需要它%7得到的数,接下来就只需要根据前面取余的数再取相对应的数组mod里的数,0只需要都放在所构造的数后面。
int a[10], mod[7], b[4]={1, 6, 8, 9}, vis[4];
void dfs(int x, int k)    //dfs深搜,由1,6,8,9四个数组成的数(只需要一个就行)放进mod数组内,其实也可以自己枚举
{
	if(k==4)
	{
		mod[x%7]=x;
		return ;
	}
	int t;
	for(t=0; t<4; ++t)
	{
		if(!vis[t])
		{
			vis[t]=1;
			dfs(x*10+b[t], k+1);
			vis[t]=0;
		}
	}
	return ;
}

int main()
{
	int t, j, k;
	char p[N];
	dfs(0, 0);
	while(scanf("%s", p)!=EOF)
	{
		j=strlen(p);
		memset(a, 0, sizeof(a));
		for(t=0; t<j; ++t)
		{
			a[p[t]-'0']++;
		}
		a[1]--;
		a[6]--;
		a[8]--;
		a[9]--;
		k=0;
		for(j=1; j<=9; ++j)
		{
			for(t=1; t<=a[j]; ++t)
			{
				printf("%d", j);
				k=k*10+j;   //这行包括下面一行是大数取余的操作
				k%=7;
			}
		}
		k=k*10000%7;   //注意这里还要预先操作后面的四位数
		if(!k)
			printf("%d", mod[0]);		
		else printf("%d", mod[7-k]);
		for(t=0; t<a[0]; ++t)
			printf("0");
		printf("\n");
	}
	return 0;
}
		

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值