题意:找出n!在b进制下有t个后导零,找出最大的b
思路:素数筛,找出每一个n!下每个素数有多少次方,贡献为次方数/t,然后快速幂计算乘积
#include<bits/stdc++.h>
#define INT_MINs -2000000000
#define INT_MAXs 1000000001
#define mod 10000019
#define MID int mid=(l+r)>>1
#define REP1(i,x,y) for(int i=x;i<y;i++)
#define REP2(i,x,y) for(int i=x;i<=y;i++)
#define ls (2*k)
#define rs (2*k+1)
#define lson l,mid,2*k
#define rson mid+1,r,2*k+1
#define lc u << 1
#define rc u << 1 | 1
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define IOS ios::sync_with_stdio(0)
#define pb(a) push_back(a)
#define pi acos(-1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
ll qk(ll x,ll y){ll ans=1;while(y){if(y&1) ans=ans*x%mod;y>>=1;x=x*x%mod;}return ans;}
const int dx[8] = { 0,-1,0,1,-1,-1,1,1}, dy[8] = { -1,0,1,0,-1,1,-1,1};
const int dxx[8]={2,1,-1,-2,-2,-1, 1, 2},dyy[8]={1,2,2 ,1, -1,-2,-2,-1};//×ßÂí
const int N=100005;
int pri[N];
int vis[N];
int cnt=0;
void prime(){
for(int i=2;i<N;i++){
//if(pri[2]>=30000){
//printf("%d\n",i);
//break;
//}
if(!vis[i])
pri[++cnt]=i;//printf("%d %d\n",cnt,pri[cnt]);
for(int j=1;j<=cnt&&pri[j]*i<N;j++){
vis[pri[j]*i]=1;
if(i%pri[j]==0)
break;
}
}
}
void solve()
{
int _;
scanf("%d",&_);
prime();
//for(int i=1;i<=10;i++){
//printf("%d\n",pri[i]);
//}
//printf("%d\n",cnt);
int Case=0;
while(_--){
int n,m;
scanf("%d%d",&n,&m);
ll ans=1;
for(int i=1;i<=cnt;i++){
int k=n;
int num=0;
//printf("%d\n",pri[i]);
while(k){
num+=k/pri[i];
k/=pri[i];
}
if(num>=m){
ans=ans*qk(pri[i],num/m)%mod;
}else{
break;
}
}
if(ans==1){
printf("Case %d: -1\n",++Case);
}else{
printf("Case %d: %lld\n",++Case,ans);
}
}
}
int main()
{
solve();
return 0;
}