poj1152 數學題(進位位)

來源:互聯網
上載者:User

題意:是給你一個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;}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.