题目链接:https://vjudge.net/contest/373416#problem/I
Input
10 2
Output
2
Input
20190929 1605
Output
363165664
Input
947 987654321987654321
Output
593574252
翻译:
给定x和n,计算f(x,1)
∗
*
∗f(x,2)
∗
*
∗…f(x,n)
f(x,y)=g(y,
x
1
x_1
x1)
∗
*
∗ g(y,
x
2
x_2
x2)
∗
*
∗ …g(y,
x
n
x_n
xn)(
x
1
x_1
x1,
x
2
x_2
x2…
x
n
x_n
xn为x的素因子)
g(x,p)=max(pk1,pk2,pk3,pkn)(x能被pk整除)
例如:
x=10,n=2
f(10,1)
∗
*
∗ f(10,2)=g(1,2)
∗
*
∗ g(1,5)
∗
*
∗ g(2,2)
∗
*
∗ g(2,5)
分析:
f(x,1)
∗
*
∗f(x,2)
∗
*
∗…f(x,n)=
g(1,
x
1
x_1
x1)
∗
*
∗ g(2,
x
1
x_1
x1)
∗
*
∗ g(3,
x
1
x_1
x1)
∗
*
∗ …g(n,
x
1
x_1
x1)
∗
*
∗
g(1,
x
2
x_2
x2)
∗
*
∗ g(2,
x
2
x_2
x2)
∗
*
∗ g(3,
x
2
x_2
x2)
∗
*
∗ …g(n,
x
2
x_2
x2)
∗
*
∗
…
g(1,
x
n
x_n
xn)
∗
*
∗ g(2,
x
n
x_n
xn)
∗
*
∗ g(3,
x
n
x_n
xn)
∗
*
∗ …g(n,
x
n
x_n
xn)
1~n个数中,能够整除
x
1
x_1
x1的数字一共有n/
x
1
x_1
x1个
整除
x
1
2
x_1^2
x12的数字一共有n/
x
1
2
x_1^2
x12个
以此类推。。。。
可以得出在这个n个数中,有n/
x
1
x_1
x1项贡献
x
1
x_1
x1;
有n/
x
2
2
x_2^2
x22项贡献
x
2
2
x_2^2
x22
以此类推。。。。。
考虑:
能够整除
x
1
2
x_1^2
x12的数字必定能够整除
x
1
x_1
x1,即整除
x
k
x^k
xk的数字必定能够整除
x
t
x^t
xt(0<t<k)。
需要去重:
n/
x
1
x_1
x1项贡献的
x
1
x_1
x1全部乘上:quick_mi(
x
1
x_1
x1,n/
x
1
x_1
x1)(快速幂)
计算n/
x
1
2
x_1^2
x12项的贡献时,只需要乘以quick_mi(
x
1
x_1
x1,n/
x
1
2
x_1^2
x12)
例如:
2 4 6 8 10 (
x
1
x_1
x1=2)
第一次乘以
2
5
2^5
25
第二次:4和8能整除
x
2
2
x_2^2
x22,第一次,4和8已经对答案贡献了2,只需要乘以
2
2
2^2
22即可。
完整代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int mod=1e9+7;
const int N=1e6+10;
LL x,n,prime[N];
int tot;
void solve(LL x)///求x的所有素因子
{
for(int i=2; i*i<=x; i++)
{
if(x%i==0)
{
prime[tot++]=i;
while(x%i==0)
x/=i;
}
}
if(x>1)
prime[tot++]=x;
}
LL quick_mi(LL a,LL b)
{
LL res=1;
while(b)
{
if(b&1)
res=(res*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return res;
}
LL g(LL n,LL m)
{
LL t=0;
for(LL i=m; i<=n; i)
{
t+=(n/i);
n/=i;///1~n中能整除prime[i],prime[i]^2,,,prime[i]^n项的和
}
return quick_mi(m,t);
}
int main()
{
scanf("%lld%lld",&x,&n);
solve(x);
LL res=1;
for(int i=0; i<tot; i++)
{
LL sum;
sum=g(n,prime[i]);
res=(res*sum)%mod;
}
printf("%lld\n",res);
return 0;
}