这题刚开始着重看到了g和f函数上去了,后来看到了1e18知道了应该是个分解质因数的问题
对g和f函数的参数简单理解下,f(x,y) 、g(y,p)只需要预处理出x的质因子即可,然后求解1~n中质因子的各幂次倍数有多少个即可
不过有个玄学问题,先预处理出每个质因子及其幂次的倍数的总数再跑快速幂会T,但是对于每次循环中跑就可以过。。很玄学
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
const int N = 1e5+10;
int pfac[N], cnt;
ll quick_pow(ll a, ll p){
ll ans = 1 % mod;
while(p){
if(p & 1) ans = ans * a % mod;
a = a * a % mod;
p >>= 1;
}
return ans;
}
int main()
{
ll x, n;
scanf("%lld%lld", &x, &n);
for(int f = 2; f <= x / f; f++){
if(x % f == 0){
pfac[cnt++] = f;
while(x % f == 0) x /= f;
}
}
if(x > 1) pfac[cnt++] = x;
ll res = 1;
for(int i = 0; i < cnt; i++){
ll t = pfac[i];
//int tsum = 0;
while(t <= n){
//tsum += n / t;
res = res * quick_pow(pfac[i], n / t) % mod;
if(n / t >= pfac[i]) t *= pfac[i];
else break;
}
}
printf("%lld\n", res);
return 0;
}