考察的知识点很简单,就是分解质因数,和求出阶乘内某个质因子的个数。
分解完质因子后,记录下每个质因子的个数,然后计算阶乘内该因子的个数,所有的求完后即可得到答案
/*
ID: CUGB-wwj
PROG:
LANG: C++
*/
#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <cmath>
#include <ctime>
#define INF 9223372036854775807LL
#define MAXN 1005
#define PI acos(-1.0)
using namespace std;
bool tag[10000005];
long long p[1000005];
int cnt;
void get_prime()
{
cnt = 0;
tag[1] = 1;
for (long long i = 2; i < 10000000LL; i++)
{
if (!tag[i])
p[cnt++] = i;
for (long long j = 0; j < cnt && p[j] * i < 10000000LL; j++)
{
tag[i*p[j]] = 1;
if (i % p[j] == 0)
break;
}
}
}
struct wwj
{
long long pm;
int num;
}pp[100];
int main()
{
get_prime();
int T;
long long n, k;
scanf("%d", &T);
int cas = 0;
while(T--)
{
scanf("%I64d%I64d", &n, &k);
if(k == 1) {printf("Case %d: ", ++cas); printf("inf\n"); continue;}
int num = 0;
long long pm = 0;
int fk = 0;
for(int i = 0; i < cnt && p[i] * p[i] <= k; i++)
{
if(k % p[i] == 0)
{
int ct = 0;
while(k % p[i] == 0)
{
k /= p[i];
ct++;
}
pp[fk].pm = p[i];
pp[fk++].num = ct;
}
}
if(k != 1) {pp[fk].pm = k; pp[fk++].num = 1;}
long long ans = INF;
for(int i = 0; i < fk; i++)
{
long long sum = 0;
long long tn = n;
while(tn){sum += tn / pp[i].pm; tn /= pp[i].pm;}
ans = min(ans, sum / pp[i].num);
}
printf("Case %d: ", ++cas);
if(ans == INF) printf("inf\n");
else printf("%I64d\n", ans);
}
return 0;
}