bzoj3601 一个人的数论 莫比乌斯反演+高斯消元

题目大意:
设fd(n)代表n以内与n互质的数的d次幂的和。
给出n和d,求fd(n)。

题目分析:
围观题解.
数论渣渣表示orz……

代码如下:

#include <cstdio>
#include <algorithm>
#include <iostream>
#define N 120
using namespace std;
typedef long long LL;
const int mod=1e9+7;
LL d,w;
LL f[N][N],a[N];
LL h[N],ans;
LL Fast_Power(LL a,LL k)
{
    LL ans=1;
    if(k<0) k+=mod-1;
    while(k)
    {
        if(k&1) ans=ans*a%mod;
        a=a*a%mod;
        k>>=1;
    }
    return ans;
}
void Gauss()
{
    int i,j,k;
    for(i=1;i<=d+1;i++)
    {
        LL tmp;
        for(j=1,tmp=i;j<=d+1;j++,tmp=tmp*i%mod)
            f[i][j]=tmp;
        for(j=1,tmp=1;j<=d;j++,tmp=tmp*i%mod);
        f[i][d+2]=(f[i-1][d+2]+tmp)%mod;
    }
    for(i=1;i<=d+1;i++)
    {
        for(j=i;j<=d+1;j++) if(f[j][i]) break;
        for(k=1;k<=d+2;k++) swap(f[i][k],f[j][k]);
        for(j=i+1;j<=d+1;j++)
        {
            LL tmp=mod-f[j][i]*Fast_Power(f[i][i],mod-2)%mod;
            for(k=i;k<=d+2;k++)
                (f[j][k]+=f[i][k]*tmp)%=mod;
        }
    }
    for(i=d+1;i;i--)
    {
        a[i]=f[i][d+2]*Fast_Power(f[i][i],mod-2)%mod;
        for(j=i-1;j;j--)
            ((f[j][d+2]-=f[j][i]*a[i]%mod)+=mod)%=mod;
    }
}
int main()
{
    scanf("%d%d",&d,&w);
    Gauss();
    for(int i=1;i<=d+1;i++) h[i]=1;
    for(int i=1;i<=w;i++)
    {
        LL p,a;
        scanf("%lld%lld",&p,&a);
        for(int j=1;j<=d+1;j++)
            (h[j]*=Fast_Power(p,a*j)%mod*(1ll-Fast_Power(p,d-j)+mod)%mod)%=mod;
    }
    for(int i=1;i<=d+1;i++)
        (ans+=a[i]*h[i])%=mod;
    cout<<ans<<endl;
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值