基准时间限制:1 秒 空间限制:131072 KB 分值: 20
难度:3级算法题
收藏
关注
有一个字符串S,记录了一个大数,但不知这个大数是多少进制的,只知道这个数在K进制下是K - 1的倍数。现在由你来求出这个最小的进制K。
例如:给出的数是A1A,有A则最少也是11进制,然后发现A1A在22进制下等于4872,4872 mod 21 = 0,并且22是最小的,因此输出k = 22(大数的表示中A对应10,Z对应35)。
Input
输入大数对应的字符串S。S的长度小于10^5。
Output
输出对应的进制K,如果在2 - 36范围内没有找到对应的解,则输出No Solution。
Input示例
A1A
Output示例
22
题解:
利用同余求模定理 (a*b)mod k== (a mod k)*(b mod k)
并且 k mod (k-1) ==1
故k的n次方 模 k-1 恒等于 1
因此这个题目就可以把每一位上的数字加起来然后枚举k
注意,这里的进制k根据这个字符串确定最小的进制,没有答案的时候输出 no solution
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define MAXN 100005
char str[MAXN];
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%s",str)!=EOF)
{
int ans=0,len=strlen(str);
int min_mod=1;
for(int i=0;i<len;i++){
if(str[i]>='0'&&str[i]<='9')
ans+=str[i]-'0',min_mod=max(min_mod,str[i]-'0');
else if(str[i]>='A'&&str[i]<='Z')
ans+=str[i]-'A'+10,min_mod=max(min_mod,str[i]-'A'+10);
}
int flag=0;
for(int i=min_mod;i<36;i++){
if(ans%i==0){
flag=i;
break;
}
}
if(flag)
printf("%d\n",flag+1);
else
puts("No Solution");
}
return 0;
}