51 Nod 1116 K進位制下的大數
阿新 • • 發佈:2018-12-13
基準時間限制: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"); }