您的位置:首页 > 其它

codeforce 221 Div2 C - Divisible by Seven

2013-12-25 21:30 274 查看
codeforce 221 Div2 C - Divisible>

当时做这题的时候,就在想是不是1,6,8,9任意组合是否都能被7整除,后来发现不是,我只是随便挑了几个,发现只有1869和9681能被7整除。。。。后来就往其他方向去想了,假如我发现有两个能被7整除,一定有什么蹊跷或者,我把这24种情况都列出来,可能就可以想到这一点了,,,,,可惜可惜。

其实,只要把这24种情况都列出来我们会发现:

1869%7 = 0 8169%7 = 0 9186%7 = 2 6189%7 = 1

1896%7 = 6 8196%7 = 6 9168%7 = 5 6198%7 = 3

1689%7 = 2 8619%7 = 2 9816%7 = 2 6819%7 = 1

1698%7 = 4 8691%7 = 4 9861%7 = 5 6891%7 = 3

1986%7 = 5 8961%7 = 1 9681%7 = 0 6198%7 = 3

1968%7 = 1 8916%7 = 5 9618%7 = 0 6189%7 = 1

0~6各种余数都有,而且题目告诉我们所有数据一定包括1,6,8,9这四个数;

所以我们只需要计算所有的数,除一个1,6,8,9,其余的余7为多少,假如为n,后面就补上一个1,6,8,9组合后余7为:7-n的数。

也就是说,所有的测试数据都能被7整除,而且排列只需调整后面的1,6,8,9这四个数的顺序即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 1000006;
char s[maxn];
int ans[8] = {1869,1896,1986,8691,6198,1689,1968};
int main()
{
while(scanf("%s",s)!=EOF){
int len = strlen(s);
int A[10] = {0};
for(int i=0;i<len;i++){
A[s[i]-'0']++;
}
int m = 0;
for(int i=1;i<A[1];i++)  {printf("1");m = (m*10 +1)%7;}
for(int i=1;i<=A[2];i++) {printf("2");m = (m*10 +2)%7;}
for(int i=1;i<=A[3];i++) {printf("3");m = (m*10 +3)%7;}
for(int i=1;i<=A[4];i++) {printf("4");m = (m*10 +4)%7;}
for(int i=1;i<=A[5];i++) {printf("5");m = (m*10 +5)%7;}
for(int i=1;i<A[6];i++)  {printf("6");m = (m*10 +6)%7;}
for(int i=1;i<=A[7];i++) {printf("7");m = (m*10 +7)%7;}
for(int i=1;i<A[8];i++)  {printf("8");m = (m*10 +8)%7;}
for(int i=1;i<A[9];i++)  {printf("9");m = (m*10 +9)%7;}
m = (m*10000) % 7 ;
printf("%d",ans[m]);
for(int i=1;i<=A[0];i++) printf("0");
printf("\n");
}
return 0;
}


如果你有其他解法,请与我留言,一起进步,多谢!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: