有一个字符串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
这道题有O(n)的做法。
首先呢,kmod(k-
1)=
1,那么k的幂次方
mod(k-
1)也为
1.
假设s是可以被k-
1整除的,
那么S可以看成(
a[
0]*k+
a[
1]*k^
1+
a[
2]*k^
2+
a[
3]*k^
3...+
a[n-
1]*k*(n-
1))
为啥这样弄呢,例如(
a[i]*k^i)
mod(k-
1)可以化成
a[i]
mod(k-
1)*k^imod(k-
1)=
a[i]
mod(k-
1)
那么可以简化成s=
a[
0]+
a[
1]+
a[
2]+....
a[n-
1]..
然后从小到大求符合s%(k-
1)符合条件的k即可。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<ctime>
#include<string>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#include<set>
#include<map>
#include<cstdio>
#include<limits.h>
#define MOD 1000000007
#define fir first
#define sec second
#define fin freopen("/home/ostreambaba/文档/input.txt", "r", stdin)
#define fout freopen("/home/ostreambaba/文档/output.txt", "w", stdout)
#define mes(x, m) memset(x, m, sizeof(x))
#define Pii pair<int, int>
#define Pll pair<ll, ll>
#define INF 1e9+7
#define inf 0x3f3f3f3f
#define Pi 4.0*atan(1.0)
#define lowbit(x) (x&(-x))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define max(a,b) a>b?a:b
typedef long long ll;
typedef unsigned long long ull;
const double eps =
1e-9;
const int maxn =
100000+
5;
using namespace std;
inline int read(){
int x(
0),f(
1);
char ch=getchar();
while(ch<
'0'||ch>
'9'){
if(ch==
'-')f=-
1;ch=getchar();}
while(ch>=
'0'&&ch<=
'9')x=x*
10+ch-
'0',ch=getchar();
return x*f;
}
int main(){
string str;
cin>>str;
int sum=
0;
int st=
0;
int r;
for(
int i=
0;i<str.size();++i){
if(
isdigit(str[i])){
r=str[i]-
'0';
sum+=r;
}
else{
r=str[i]-
'A'+
10;
sum+=r;
}
st=max(st,r);
}
bool flag=
false;
for(
int i=st;i<=
36;++i){
if(sum%i==
0){
printf(
"%d\n",i+
1);
flag=
true;
break;
}
}
if(!flag){
puts(
"No Solution");
}
return 0;
}
转载请注明原文地址: https://ju.6miu.com/read-36549.html