1. 程式人生 > >CodeForces - 375A Divisible by Seven(數學)

CodeForces - 375A Divisible by Seven(數學)

末尾 net true namespace 數學 位置 字符串 根據 ring

https://vjudge.net/problem/48715/origin

題意:給出必定含1689四個數字的字符串,隨意交換位置構造出能被7整除的數。

分析:數學思維題。觀察發現1689的排列與7的余數恰好是0...6,那麽利用這個性質去與串中其他數字相補出能被7整除的數,把1689固定在後四位,把0獨自提取出來,其他數字為一組,把它們的數值*10000後mod7,根據得到的余數選擇相應的1689排列,最後把0放在末尾(對結果正確性沒有影響)。
代碼:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cmath>
 4
#include <algorithm> 5 #include <cstdlib> 6 #include <cstring> 7 #include <queue> 8 9 #define LL long long 10 11 using namespace std; 12 13 char s[1001000]; 14 char w[1001000]; 15 16 bool mark[11]; 17 18 int main() 19 { 20 21 memset(mark,false,sizeof(mark)); 22 23 LL top = 0
,sum = 0,i,Zero = 0; 24 25 cin>>s; 26 27 int len = strlen(s); 28 29 for(i = 0;i < len; ++i) 30 { 31 if((s[i] == 1 || s[i] == 6 || s[i] == 8 || s[i] == 9) && mark[s[i]-0] == false) 32 { 33 mark[s[i]-0] = true; 34 } 35 else
if(s[i] == 0) 36 { 37 Zero ++; 38 } 39 else 40 { 41 w[top++] = s[i]; 42 } 43 } 44 45 for(i = 0;i < top; ++i) 46 { 47 sum *= 10; 48 sum += (w[i]-0); 49 sum %= 7; 50 } 51 52 sum *= 10000; 53 sum %= 7; 54 55 for(i = 0;i < top; ++i) 56 { 57 printf("%c",w[i]); 58 } 59 60 switch(sum) 61 { 62 case 0:printf("1869");break; 63 case 6:printf("1968");break; 64 case 5:printf("1689");break; 65 case 4:printf("6198");break; 66 case 3:printf("8691");break; 67 case 2:printf("9861");break; 68 case 1:printf("8196");break; 69 } 70 71 while(Zero--) 72 { 73 printf("0"); 74 } 75 cout<<endl; 76 77 return 0; 78 }

CodeForces - 375A Divisible by Seven(數學)