http://www.lightoj.com/volume_showproblem.php?problem=1340
题意:问n!在b进制下至少有t个后缀零,求最大的b。
思路:很容易想到一个数通过分解素因子可以得到最大的指数。那么问题关键在于求得n!的素因子的指数,找到指数大于t的所有素因子,再将那些指数除去t,剩下的数就是最大的b了。分解阶乘时,对n不断除素数p,直到n为0时,此时商的和即该素因子的指数。
/** @Date : 2016-11-30-19.35 * @Author : Lweleth (SoungEarlf@gmail.com) * @Link : https://github.com/ * @Version : */ #include<bits/stdc++.h> #define LL long long #define PII pair #define MP(x, y) make_pair((x),(y)) #define fi first #define se second #define PB(x) push_back((x)) #define MMG(x) memset((x), -1,sizeof(x)) #define MMF(x) memset((x),0,sizeof(x)) #define MMI(x) memset((x), INF, sizeof(x)) using namespace std; const int INF = 0x3f3f3f3f; const int N = 1e5+2000; const int mod = 10000019; LL pri[N]; int c = 0; bool vis[N]; void prime() { for(int i = 2; i < N; i++) { if(!vis[i]) { for(int j = i + i; j < N; j+= i) { if(!vis[j]) vis[j] = 1; } pri[c++] = i; } } } LL fpow(LL a, LL n) { LL r = 1; while(n > 0) { if(n & 1) r = r * a % mod; a = a * a % mod; n >>= 1; } return r; } int main() { prime(); int T; int cnt = 0; cin >> T; while(T--) { LL n; LL r; cin >> n >> r; LL ans = 1; for(int i = 0; i < c && pri[i] <= n; i++) { LL t = n; LL ct = 0; while(t) { ct += t / pri[i]; t /= pri[i]; } if(ct >= r) ans = ans * fpow(pri[i], ct/r) % mod; if(ct < r) break; } if(ans == 1) printf("Case %d: -1\n", ++cnt); else printf("Case %d: %d\n", ++cnt, ans); } return 0; }