题目大意:
设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;
}