题意:给定一整数R表示N进制数,求最小的N满足R%(N-1)=0.
思路:没注意输入的最大值为32KB,RE一次,如下推倒:
设输入的是abcd,假设其解是n进制,因为每一位必然小于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,可见数学题无从下手时可以推到以下公式^_^
题目链接:http://poj.org/problem?id=1152
View Code
1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <string> 6 #include <algorithm> 7 #include <iostream> 8 using namespace std; 9 10 char str[32768],MAX; 11 12 int To(char c){ 13 if(c>='0'&&c<='9') return c-'0'; 14 else{ 15 if(c>='A'&&c<='Z') return c-'A'+10; 16 else return c-'a'+36; 17 } 18 } 19 20 int main(){ 21 22 // freopen("data.in","r",stdin); 23 // freopen("data.out","w",stdout); 24 25 bool flag; 26 while(scanf("%s",str)!=EOF){ 27 flag=false; 28 MAX=0; 29 int sum=0; 30 for(int i=0;str[i]!='\0';i++){ 31 if(To(str[i])>MAX) MAX=To(str[i]); 32 sum+=To(str[i]); 33 } 34 for(int i=MAX+1;i<=62;i++){ 35 if(sum%(i-1)==0){ 36 flag=true; 37 printf("%d\n",i); 38 break; 39 } 40 } 41 if(!flag) puts("such number is impossible!"); 42 } 43 return 0; 44 }