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! 中 p 的指数,结果记为 b.

则 t=min(b/ 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编辑  收藏  举报

导航