C. Primes and Multiplication(数学)(防止爆精度)
Let's introduce some definitions that will be needed later.
Let
Let
g ( 45 , 3 ) = 9 ">g(45,3)=9g(45,3)=9 (45 ">4545 is divisible by3 2 = 9 ">32=932=9 but not divisible by3 3 = 27 ">33=2733=27),g ( 63 , 7 ) = 7 ">g(63,7)=7g(63,7)=7 (63 ">6363 is divisible by7 1 = 7 ">71=771=7 but not divisible by7 2 = 49 ">72=4972=49).
Let
f ( 30 , 70 ) = g ( 70 , 2 ) ⋅ g ( 70 , 3 ) ⋅ g ( 70 , 5 ) = 2 1 ⋅ 3 0 ⋅ 5 1 = 10 ">f(30,70)=g(70,2)?g(70,3)?g(70,5)=21?30?51=10f(30,70)=g(70,2)?g(70,3)?g(70,5)=21?30?51=10,f ( 525 , 63 ) = g ( 63 , 3 ) ⋅ g ( 63 , 5 ) ⋅ g ( 63 , 7 ) = 3 2 ⋅ 5 0 ⋅ 7 1 = 63 ">f(525,63)=g(63,3)?g(63,5)?g(63,7)=32?50?71=63f(525,63)=g(63,3)?g(63,5)?g(63,7)=32?50?71=63.
You have integers
The only line contains integers
Print the answer.
Examples input Copy10 2
output
Copy
2
input
Copy
20190929 1605
output
Copy
363165664
input
Copy
947 987654321987654321
output
Copy
593574252
Note
In the first example,
In the second example, actual value of formula is approximately
In the third example, be careful about overflow issue.
#include#include #include #include using namespace std; typedef unsigned long long ll; ll fac[10050], num;//素因数,素因数的个数 const ll mod=1e9+7; ll pow_mod(ll a, ll n, ll m) { if(n == 0) return 1; ll x = pow_mod(a, n/2, m); ll ans = (ll)x * x % m; if(n % 2 == 1) ans = ans *a % m; return (ll)ans; } void init(ll n) {//唯一分解定理 num = 0; ll cpy = n; ll m = (int)sqrt(n + 0.5); for (int i = 2; i <= m; ++i) { if (cpy % i == 0) { fac[num++] = i; while (cpy % i == 0) cpy /= i; } } if (cpy > 1) fac[num++] = cpy; } int main(){ ll x,n; cin>>x>>n; init(x); ll ans=1; for(ll i=0;i ){ for(ll cur=fac[i];;cur*=fac[i]){ ans=ans*pow_mod(fac[i],n/cur,mod)%mod; if(cur>n/fac[i]) break; } } cout< endl; }