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 }