ural 1104 && ural 1352
题目:http://acm.timus.ru/problem.aspx?space=1&num=1352
题意:首先定义梅森尼质数:符合 2 ^ p - 1是素数的数,现在给出一个 n 让你输出一个 p 满足 2 ^ p - 1 是第 n 个梅森尼质数 ( n < 39)
打表的过的,就没什么可说的了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 const int x[]={0,2,3,5,7,13,17,19,31,61,89, 2 107,127,521,607,1279,2203,2281,3217,4253,4423, 3 9689,9941,11213,19937,21701,23209,44497,86243,110503,132049, 4 216091,756839,859433,1257787,1398269,2976221,3021377,6972593}; 5 int t,n; 6 int main() 7 { 8 cin>>t; 9 while (t--) 10 { 11 cin>>n; 12 cout<<x[n]<<endl; 13 } 14 return 0; 15 }
题目:http://acm.timus.ru/problem.aspx?space=1&num=1104
题意:给出一个 k 进制写的数,问是否存在一个 k可以满足把 给的 k 进制的数可以整除 (k - 1);
发现 ural 里的discuss 真有意思,错了哪个样例,基本都可以在里面找到解决办法。以前好像做个这个题,觉得好熟悉,根据取余的性质 (a * b) % c = (a % c * b % c) % c;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 const int N = 1000001; 2 char str[N]; 3 int a[N]; 4 int main() 5 { 6 int i,j; 7 //freopen("data.txt","r",stdin); 8 while(cin>>str) 9 { 10 int len = strlen(str); 11 int tem = 0; 12 for(i = 0; i < len; i++) 13 { 14 if(str[i] >= 'A' && str[i] <= 'Z') 15 a[i] = (str[i] - 'A' + 10); 16 else a[i] = str[i] - '0'; 17 tem = Max(a[i],tem); 18 } 19 if(tem < 2) {printf("2\n");continue;} // 注意这里,如果不写,会在第 7 个样例 crash(我的是这样的) 20 int kem; 21 for(i = tem + 1; i <= 36; i++) // 这里 符合题意的最小 k 一定要比给的进制里最大的还要大 22 { 23 kem = 0; 24 for(j = 0; j < len; j++) 25 { 26 kem = kem * i + a[j]; 27 kem %= (i - 1); 28 } 29 if(!kem) break; 30 } 31 if(!kem) printf("%d\n",i); 32 else printf("No solution.\n"); 33 } 34 return 0; 35 }