首页 > 其他 > 详细

CF1097D Makoto and a Blackboard

时间:2019-10-23 17:03:22      阅读:102      评论:0      收藏:0      [点我收藏+]

题目
一个较为直观的想法是把所有因数找出来,暴力dp跑\(k\)轮,复杂度bomb。
然后我们仔细观察一下,这个答案显然是一个积性函数,我们可以把\(n\)拆成若干个\(p^a\)分别跑然后乘起来。
这样的话复杂度就没问题了,可以用矩阵快速幂优化转移过程,但是没有必要。

#include<bits/stdc++.h>
#define pb push_back
#define ll long long
using namespace std;
const int N=51,P=1000000007;
ll n,pr[N];int m,K,inv[51],f[51],g[51],cnt[N],sz;
void inc(int &a,int b){a+=b,a=a>=P? a-P:a;}
int mul(int a,int b){return 1ll*a*b%P;}
int power(int a,int k){int r=1;for(;k;k>>=1,a=mul(a,a))if(k&1)r=mul(a,r);return r;}
void initfac(ll x=n)
{
    for(int i=2;1ll*i*i<=x;++i) if(!(x%i)) for(pr[++m]=i;!(x%i);x/=i,++cnt[m]);
    if(x^1) pr[++m]=x%P,cnt[m]=1;
}
int main()
{
    cin>>n>>K,initfac();int i,j,k,o,ans=1,sum;
    for(inv[1]=1,i=2;i<=50;++i) inv[i]=mul(P-P/i,inv[P%i]);
    for(i=1;i<=m;++i)
    {
    memset(f,0,sizeof f),f[cnt[i]]=1,sum=0;
        for(j=1;j<=K;++j)
    {
        memcpy(g,f,sizeof g),memset(f,0,sizeof f);
        for(k=0;k<=cnt[i];++k) for(o=k;o<=cnt[i];++o) inc(f[k],mul(g[o],inv[o+1]));
        }
    for(j=0;j<=cnt[i];++j) inc(sum,mul(f[j],power(pr[i],j)));
    ans=mul(ans,sum);
    }
    cout<<ans;
}

CF1097D Makoto and a Blackboard

原文:https://www.cnblogs.com/cjoierShiina-Mashiro/p/11727168.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!