1116 K进制下的大数
基准时间限制: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
正如一个数能被9整除的充要条件是各位置上的数字之和被9整除一样,K进制下的数能被K-1整除的充要条件是各个位置上的数字之和能被K-1整除。。。
#include<bits/stdc++.h>
#include<stdio.h>
#include<iostream>
#include<cmath>
#include<math.h>
#include<queue>
#include<set>
#include<map>
#include<iomanip>
#include<algorithm>
#include<stack>
#define inf 0x3f3f3f3f
typedef long long ll;
namespace IO {const int MT = 10 * 1024 * 1024; /// 10MB 请注意输入数据的大小!!!char IO_BUF[MT];int IO_PTR, IO_SZ;/// 要记得把这一行添加到main函数第一行!!!void begin() {IO_PTR = 0;IO_SZ = fread (IO_BUF, 1, MT, stdin);}template<typename T>inline bool scan_d (T & t) {while (IO_PTR < IO_SZ && IO_BUF[IO_PTR] != '-' && (IO_BUF[IO_PTR] < '0' || IO_BUF[IO_PTR] > '9'))IO_PTR ++;if (IO_PTR >= IO_SZ) return false;bool sgn = false;if (IO_BUF[IO_PTR] == '-') sgn = true, IO_PTR ++;for (t = 0; IO_PTR < IO_SZ && '0' <= IO_BUF[IO_PTR] && IO_BUF[IO_PTR] <= '9'; IO_PTR ++)t = t * 10 + IO_BUF[IO_PTR] - '0';if (sgn) t = -t;return true;}inline bool scan_s (char s[]) {while (IO_PTR < IO_SZ && (IO_BUF[IO_PTR] == ' ' || IO_BUF[IO_PTR] == '\n') ) IO_PTR ++;if (IO_PTR >= IO_SZ) return false;int len = 0;while (IO_PTR < IO_SZ && IO_BUF[IO_PTR] != ' ' && IO_BUF[IO_PTR] != '\n')s[len ++] = IO_BUF[IO_PTR], IO_PTR ++;s[len] = '\0';return true;}template<typename T>void print(T x) {static char s[33], *s1; s1 = s;if (!x) *s1++ = '0';if (x < 0) putchar('-'), x = -x;while(x) *s1++ = (x % 10 + '0'), x /= 10;while(s1-- != s) putchar(*s1);}template<typename T>void println(T x) {print(x); putchar('\n');}
};
using namespace IO;
using namespace std;
char s[1000050];
int n,w=0;
int digit(char c){if('0'<=c&&c<='9')return c-'0';return c-'A'+10;
}
int main(){begin();scan_s(s);int len=strlen(s);for(int i=0;i<len;++i){n+=digit(s[i]);w=max(w,digit(s[i]));}for(int i=w;i<36;++i)if(n%i==0){printf("%d\n",i+1);return 0;}printf("No Solution\n");
}