zoj 3621 Factorial Problem in Base K
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4745
解题思路:首先将 k 进制表示的 s 转成十进制的 n, 然后在十进制下求最大的 t, 使得 kt 整除 n! 且 kt+1 不整除 n! .
先求 k 的标准分解式为 k=p1a1p2a2···pmam, 由于 2≤k≤62 , 故 k 最多可能有 2, 3, 5, 7 共 4 个素因子。
再由 n! 中素数 p 的指数为 [n/p]+[n/p2]+...+[n/pk], 其中pk≤n<pk+1 , 求 n! 中 pi 的指数,结果记为 bi .
则 t=min(bi / ai),i=1,2,···,m.
1 /////////////////////////////////////////////////////////////////////////// 2 //problem_id: zoj 3621 3 //user_id: SCNU20102200088 4 /////////////////////////////////////////////////////////////////////////// 5 6 #include <algorithm> 7 #include <iostream> 8 #include <iterator> 9 #include <iomanip> 10 #include <cstring> 11 #include <cstdlib> 12 #include <string> 13 #include <vector> 14 #include <cstdio> 15 #include <cctype> 16 #include <cmath> 17 #include <queue> 18 #include <stack> 19 #include <list> 20 #include <set> 21 #include <map> 22 using namespace std; 23 24 /////////////////////////////////////////////////////////////////////////// 25 typedef long long LL; 26 const double PI=acos(-1.0); 27 /////////////////////////////////////////////////////////////////////////// 28 29 /////////////////////////////////////////////////////////////////////////// 30 //Add Code: 31 /////////////////////////////////////////////////////////////////////////// 32 33 int main(){ 34 /////////////////////////////////////////////////////////////////////// 35 //Add code: 36 LL k,i; 37 string s; 38 while(cin>>s>>k){ 39 LL n=0,t=0,a[4],b[4]={0},c[4]={0}; 40 for(i=0;i<s.size();i++){ //将k进制的s转化为十进制的n 41 n=n*k+s[i]-'0'-(isupper(s[i])? 7:0)-(islower(s[i])? 13:0); 42 } 43 for(i=2;i<=k;i++){ 44 if(k%i==0){ //i为k的素因子 45 while(k%i==0){ 46 k/=i; 47 b[t]++; //记录k的素因子i的指数 48 } 49 a[t++]=i; //记录k的素因子i 50 } 51 } 52 for(i=0;i<t;i++){ 53 LL q=n; 54 while(q){ 55 q/=a[i]; 56 c[i]+=q; 57 } 58 c[i]/=b[i]; //记录n!中素数a[i]的指数/k中素数a[i]的指数 59 } 60 LL ans=c[0]; 61 for(i=1;i<t;i++){ 62 if(c[i]<ans) ans=c[i]; 63 } 64 cout<<ans<<endl; 65 } 66 /////////////////////////////////////////////////////////////////////// 67 return 0; 68 } 69 70 /////////////////////////////////////////////////////////////////////////// 71 /* 72 Testcase: 73 Input: 74 101 2 75 12 7 76 Output: 77 3 78 1 79 */ 80 ///////////////////////////////////////////////////////////////////////////
posted on 2013-08-14 20:24 SCNU20102200088 阅读(223) 评论(0) 编辑 收藏 举报