hello 2019 D

时间:2023-03-09 01:06:00
hello 2019 D

一开始sb了考虑总的因子疯狂T,做题太少了。。。没意识到会有辣么多因子。。。

神仙说1e9以内的最多的就有800个因子的了。。。

然后我们可以考虑质因子

hello 2019 D

我觉得已经说得很明白了。。。

唔逆元好像exgcd比费马小定理预处理快?

en...

 #include <bits/stdc++.h>
#define mk(a,b) make_pair(a,b)
#define pii pair<int,int>
using namespace std;
typedef long long ll;
const ll mod = 1e9+;
const int N = 3e7+;
ll qpow(ll a,ll x){
ll res = ;
while (x){
if(x&)
res=(res*a)%mod;
a=(a*a)%mod;
x/=;
}
return res;
}
void exgcd(ll a,ll b,ll& d,ll& x,ll& y) {
if (!b) {
d = a;
x = ;
y = ;
} else {
exgcd(b, a % b, d, y, x);
y -= x * (a / b);
}
}
ll inv(ll a, ll p) {
ll d, x, y;
exgcd(a, p, d, x, y);
return d == ? (x + p) % p : -;
} ll n,k;
ll dp[][][];
map<ll,int> mp;
map<ll,int> m;
int main(){
ios::sync_with_stdio(false);
cin>>n>>k;
int id = ;
for(int i=;1ll*i*i<=n;i++){
if(n%i==) {
m[i] = id;
while (n%i==){
mp[i]++;
n/=i;
}
dp[id][][]=;
for(int j=;j<=mp[i];j++)
dp[id][j][]=dp[id][j-][]*i%mod;
id++;
}
}
if(n!=){
m[n]=id;
dp[id][][]=n;
dp[id][][]=;
mp[n]++;
id++;
}
for(int i=;i<=k;i++){
for(auto p:mp){
int ind = m[p.first];
ll num = p.first;
for(int j=;j<=p.second;j++){//每个次幂
for(int k=;k<=j;k++){
dp[ind][j][i]+=dp[ind][k][i-];
}
dp[ind][j][i]%=mod;
dp[ind][j][i]=dp[ind][j][i]*inv(j+,mod)%mod;
}
}
}
ll ans = ;
for(auto p:mp){
ans=(ans*dp[m[p.first]][p.second][k]%mod);
}
cout<<ans<<endl;
}