Codeforces Round #221 (Div. 2) C. Divisible by Seven(构造 大数除法 )

上几次的一道cf题。

题目:http://codeforces.com/contest/376/problem/C

性质:

(4)a与b的和除以c的余数(a、b两数除以c在没有余数的情况下除外),等于a,b分别除以c的余数之和(或这个和除以c的余数)。例如,23,16除以5的余数分别是3和1,所以(23+16)除以5的余数等于3+1=4。注意:当余数之和大于除数时,所求余数等于余数之和再除以c的余数。例如,23,19除以5的余数分别是3和4,所以(23+19)除以5的余数等于(3+4)除以5的余数。
(5)a与b的乘积除以c的余数,等于a,b分别除以c的余数之积(或这个积除以c的余数)。例如,23,16除以5的余数分别是3和1,所以(23×16)除以5的余数等于3×1=3。注意:当余数之积大于除数时,所求余数等于余数之积再除以c的余数。例如,23,19除以5的余数分别是3和4,所以(23×19)除以5的余数等于(3×4)除以5的余数。

 

 

题目给出的 1 6 8 9的组合正好能构成%7后的 0 1 2 3 4 5 6的余数,所有根据上面的性质,可以

分两种情况,

1、除了1 6 8 9外都是0的情况,这时把1 6 8 9放到前面(性质5)

2、除了1 6 8 9外还有其他的非0数的情况,这时可以吧1 6 8 9放到后面(性质4)

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cstdio>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 char s[1000005];
 9 int num[1000005];
10 char f[8][5]={"1869","1968","1689","6198","1698","1986","1896"};
11 int main()
12 {
13     int len,i,ant;
14     int a[20];
15     while(~scanf("%s",s))
16     {
17         ant=0;
18         len=strlen(s);
19         for(i=0; i<len; i++)
20         {
21             num[i]=s[i]-48;
22         }
23         memset(a,0,sizeof(a));
24         for(i=0; i<len;  i++)
25         {
26             if(num[i]==1&&a[1]==0)
27             {
28                 num[i]=0; a[1]=1;
29             }
30             if(num[i]==6&&a[6]==0)
31             {
32                 num[i]=0; a[6]=1;
33             }
34             if(num[i]==8&&a[8]==0)
35             {
36                 num[i]=0; a[8]=1;
37             }
38             if(num[i]==9&&a[9]==0)
39             {
40                 num[i]=0; a[9]=1;
41             }
42         }
43         sort(num,num+len);
44         for(i=len-1; i>=0; i--)
45         {
46             ant=ant*10+num[i];
47             ant%=7;
48         }
49         if(num[len-1]==0)    //情况1
50         {
51         printf("%s",f[(7-ant)%7]);
52         for(i=0; i<len-4; i++)
53         printf("0");
54         printf("\n");
55         }
56         else               //情况2
57         {
58             for(i=len-1; i>=4; i--)
59             printf("%d",num[i]);
60             printf("%s",f[(7-ant)%7]);
61             printf("\n");
62         }
63     }
64     return 0;
65 }

 

posted @ 2014-01-04 13:35  水门  阅读(222)  评论(0编辑  收藏  举报