題意:是給你一個N進位的整數R,題目保證R能被N-1整除,讓你求合格最小的N。
分析:看見很多大牛都覺得很水的題,但是還是要數論來證明的,自己沒能證明出來,看了牛人的證明才能水掉~~
數論的模運算證明:
設輸入的是abcd,假設其解是n進位,則有
(a*n*n*n + b*n*n + c*n + d)%(n-1)=0
則有:( (a*n*n*n)%(n-1)+ (b*n*n)%(n-1)+ (c*n)%(n-1)+d )%(n-1)=0則有:((a* (n%(n-1)) *(n%(n-1)) *(n%(n-1))) + (b* (n%(n-1)) *(n%(n-1))) + (c* (n%(n-1) + d ) %(n-1)=0則有: (a*1*1*1 + b*1*1 + c*1 + d) % (n-1)=0則有:(a+b+c+d)%(n-1)=0所以,經過轉換,變為求輸入數的各數位的和能%(n-1)等於0;
題意還有一點是:0...9...A...Z...a...z (按這樣順序,A=10, a=37)具體在代碼中有注釋;
還有一點是題目中The largest size of the input file will be 32KB 表示數組要開30001以上~
#include<iostream>#include<string>using namespace std;char str[35000];int len, n;int main(){int i,j;int sum,min,s;while(scanf("%s",&str) != EOF){n = -5;sum = 0;len = strlen(str);for(i=0; i<len; i++){if(str[i]>='0' && str[i]<='9')s = str[i] - '0';//0 ~ 9if(str[i]>='A' && str[i]<='Z')s = str[i] - 'A' + 10;//A=10 ~ Z=36 所以由題意得知這裡要加上10if(str[i]>='a' && str[i]<='z')s = str[i] - 'a' + 36;//a=37 ~ z= 63 這裡要加上36;sum += s;if(s > n)//這裡記下最大的數字,表示最小的進位要滿足(N>=n);n = s;}if(n==0){printf("2/n");continue;}min = 100;for(i=n; i<=62; i++)//從n開始迴圈{if(sum % i == 0){min = i;break;}}if(min <= 61)printf("%d/n",min+1); //因為題意是要求sum%(n-1), 所以要在最後+1;elseprintf("such number is impossible!/n");}return 0;}