线性预处理出1~1e5的素数,nlogn的也可以
对于每组n,t,把n!质因数分解再贪心即可
还可以用下快速幂进行优化
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5;
const ll mod = 10000019;
bool is_prime[MAXN + 5];
vector<int> prime;
void get_prime()
{
memset(is_prime, true, sizeof(is_prime));
is_prime[0] = is_prime[1] = false;
for(int i = 2; i <= MAXN; i++)
{
if(is_prime[i]) prime.push_back(i);
for(int j = 0; j < prime.size() && i * prime[j] <= MAXN; j++)
{
is_prime[i * prime[j]] = false;
if(i % prime[j] == 0) break;
}
}
}
ll fast_pow(ll x, int n)
{
ll res = 1;
while(n)
{
if(n & 1) res = (res * x) % mod;
x = (x * x) % mod;
n >>= 1;
}
return res;
}
int cnt(int n, int p)
{
int res = 0;
while(n)
n /= p, res += n;
return res;
}
ll solve(int n, int t)
{
ll res = 1;
for(int i = 0; i < prime.size(); i++)
{
int p = prime[i], num = cnt(n, p);
if(num < t) break;
res = (res * fast_pow(p, num / t)) % mod;
}
if(res == 1) return -1;
return res;
}
int main()
{
int T;
scanf("%d", &T);
get_prime();
for(int ca = 1; ca <= T; ca++)
{
int n, t;
scanf("%d%d", &n, &t);
printf("Case %d: %lld\n", ca, solve(n, t));
}
return 0;
}