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; }
如果你有其他解法,请与我留言,一起进步,多谢!!!