之前有一道很类似的题目
https://blog.csdn.net/z472421519/article/details/87904277
题意
定义函数
f
(
x
,
y
)
f(x,y)
f(x,y)为
x
x
x的所有的质因子,能够整除
y
y
y的最高数的乘积
比如:
f
(
525
,
63
)
=
3
2
⋅
5
0
⋅
7
1
f(525,63) = 3^2·5^0 ·7^1
f(525,63)=32⋅50⋅71
让你求出
f
(
x
,
1
)
⋅
f
(
x
,
2
)
⋅
⋅
⋅
⋅
f
(
x
,
n
)
m
o
d
(
1
0
9
+
7
)
f(x,1)·f(x,2)····f(x,n) mod(10^9+7)
f(x,1)⋅f(x,2)⋅⋅⋅⋅f(x,n)mod(109+7)
分析与解答
首先我们假设
x
x
x为一个质数,记为
p
p
p,我们可以得到,上式变为如下的式子
p
0
⋅
p
0
⋅
p
0
⋅
…
⋅
f
(
p
,
p
)
⋅
p
0
⋅
p
0
⋅
p
0
⋅
…
⋅
f
(
p
,
2
p
)
…
…
p^0·p^0·p^0·…·f(p,p)·p^0·p^0·p^0·…·f(p,2p)……
p0⋅p0⋅p0⋅…⋅f(p,p)⋅p0⋅p0⋅p0⋅…⋅f(p,2p)……进一步化简,得到下式
p
1
−
n
中
只
能
被
p
整
除
的
数
字
个
数
⋅
(
p
2
)
1
−
n
中
能
被
p
2
整
除
但
不
能
被
p
3
整
除
的
数
字
个
数
…
…
p^{1-n中只能被p整除的数字个数} · (p^2)^{1-n中能被p^2整除但不能被p^3整除的数字个数}……
p1−n中只能被p整除的数字个数⋅(p2)1−n中能被p2整除但不能被p3整除的数字个数……
拓展到非质数,我们可以欧拉函数的模板在
O
(
x
)
O(\sqrt{x})
O(x)求出x的所有质因子,对于每个质因子用上边的方法
代码
/*************************************************************************
> File Name: 2019_9_29_3.cpp
> Author: z472421519
> Mail:
> Created Time: 2019年09月29日 星期日 21时33分34秒
************************************************************************/
#include <bits/stdc++.h>
#include <cstdio>
#include <cstring>
#define ll long long
const ll mod = 1e9 + 7;
using namespace std;
ll quick_pow(ll a,ll n)
{
ll res = 1;
while(n)
{
if(n & 1)
{
res = res * a % mod;
}
a = a * a % mod;
n >>= 1;
}
return res;
}
ll cal(ll p,ll n)
{
ll res = 1;
ll t = p;
ll sum = 0;
while(p <= n)
{
if(p > n / t)
break;
p *= t;
}
while(p > 1)
{
ll T = quick_pow(p % mod,n / p - sum);
res = res * T % mod;
sum = n / p;
p = p / t;
}
return res % mod;
}
int main()
{
ll x,n;
cin >> x >> n;
//ll t = n;
ll ans = 1;
for(int i = 2;i <= x / i;i++)
if(x % i == 0)
{
//cout << i << endl;
//ans = (ans * cal(i,n)) % mod;
ans = ans * cal(i,n) % mod;
//cout << ans << endl;
while(x % i == 0)
x /= i;
}
if(x != 1)
ans = ans * cal(x,n) % mod;
cout << ans << endl;
return 0;
}