这题刚开始着重看到了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;
}