题意还是很明确的,给你一个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;
代码如下
#include<stdio.h>
#include<string.h>char str[35000];
int len, n;
void 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';
if(str[i]>='A'&&str[i]<='Z')
s=str[i]-'A'+10;
if(str[i]>='a'&&str[i]<='z')
s=str[i]-'a'+36;
sum+=s;
if(s>n)
n=s;
}
if(n==0)
{
printf("2\n");
continue;
}
min=100;
for(i=n;i<=62;i++)
{
if(sum%i==0)
{
min=i;
break;
}
}
if(min<=61)
printf("%d\n",min+1);
else
printf("such number is impossible!\n");
}
}