Let's introduce some definitions that will be needed later.
Let prime(x)
be the set of prime divisors of x. For example, prime(140)={2,5,7}, prime(169)={13}
.
Let g(x,p)
be the maximum possible integer pk where k is an integer such that x is divisible by pk
. For example:
- g(45,3)=9
(45 is divisible by 32=9 but not divisible by 33=27
- ),
- g(63,7)=7
- (63 is divisible by 71=7 but not divisible by 72=49
- ).
Let f(x,y)
be the product of g(y,p) for all p in prime(x). For example:
- f(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)=32⋅50⋅71=63
- .
You have integers x
and n. Calculate f(x,1)⋅f(x,2)⋅…⋅f(x,n)mod(109+7)
.
Input
The only line contains integers x
and n (2≤x≤109, 1≤n≤1018
) — the numbers used in formula.
Output
Print the answer.
Examples
Input
Copy
10 2
Output
Copy
2
Input
Copy
20190929 1605
Output
Copy
363165664
Input
Copy
947 987654321987654321
Output
Copy
593574252
Note
In the first example, f(10,1)=g(1,2)⋅g(1,5)=1
, f(10,2)=g(2,2)⋅g(2,5)=2
.
In the second example, actual value of formula is approximately 1.597⋅10171
. Make sure you print the answer modulo (109+7)
.
In the third example, be careful about overflow issue.
题意:给你x和n,求得x的每个素因子a[i]后,对1-n中每个数b[i],m等于a[i]^t(a[i]的t次方)中t最大且b[i]%a[i]^t==0的a[i]^t值,求所有m的乘积
思路:1-n中有n/a[i]个数能被a[i]整除,有n/(a[i]^2)个数能被a[i]^2整除。。。。以此类推,就可以快速算出答案
#include <iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
#define maxn 1050
#define mod 1000000007
#define ll long long
#define ld long double
ll qpow(ll base, ll n)
{
ll ans = 1;
while(n)
{
if(n&1)
ans=(ans%mod)*(base%mod)%mod;
base = (base%mod) * (base%mod)%mod;
n/=2;
}
return ans%mod;
}
ll f[110000] = { 0 }, g[110000] = { 0 };
int main()
{
ll k1;
f[1] = 1, f[0] = 1, f[2] = 0;
for (ll j = 2; j*j <= 100000; j++)
{
if (f[j] == 0)
{
for (ll k1 = 2; j*k1 <= 100000; k1++)
{
f[j*k1] = 1;
}
}
}
for (ll k1 = 0, x = 0; k1 < 100000; k1++)
{
if (f[k1] == 0)
{
x++;
g[x] = k1;
}
}
ll x,n;
scanf("%lld %lld",&x,&n);
ll sum=1;
ll n1=n;
for(ll i=1; g[i]*g[i]<=x; i++)
{
ll flag=0;
while(x%g[i]==0)
{
flag=1;
x/=g[i];
}
if(flag==1)
{
for(ll j=g[i]; j<=n1; j*=g[i])
{
//printf("g[%lld]=%lld n1=%lld sum=%lld j=%lld p=%lld\n",i,g[i],n1,sum,j,qpow(j,n1/j));
sum*=qpow(g[i],n1/j);
sum%=mod;
if(1000000000.0*1000000000.0<(ld)j*(ld)g[i]) break;
}
}
}
if(x!=1)
{
//printf("sum=%lld x=%lld p=%lld\n",sum,x,qpow(x,n1/x));
for(ll j=x; j<=n1; j*=x)
{
//printf("n1=%lld sum=%lld j=%lld p=%lld\n",n1,sum,j,qpow(j,n1/j));
//printf("g[%lld]=%lld n1=%lld sum=%lld j=%lld p=%lld\n",i,g[i],n1,sum,j,qpow(j,n1/j));
sum*=qpow(x,n1/j);
sum%=mod;
if(1000000000.0*1000000000.0<(ld)j*(ld)x) break;
}
}
printf("%lld\n",sum);
}