题目链接:www.lydsy.com/JudgeOnline/problem.php?id=3601
题意:
思路:
因此可以用高斯消元得到ai。
const int mod=1000000007; const int N=111; i64 myPow(i64 x,i64 y) { if(y<0) return myPow(myPow(x,mod-2),-y); i64 ans=1; while(y) { if(y&1) ans=ans*x%mod; x=x*x%mod; y>>=1; } return ans; } i64 a[N][N],pp[N]; int n,p; i64 A[N]; void init() { int i,j; for(i=0;i<=p+1;i++) { pp[i]=myPow(i+1,p)+(i==0?0:pp[i-1]); pp[i]%=mod; a[i][p+2]=pp[i]; a[i][0]=1; i64 pre=1; for(j=1;j<=p+1;j++) { pre=pre*(i+1)%mod; a[i][j]=pre; } } int k; for(i=0;i<=p+1;i++) { for(j=i;j<=p+1;j++) if(a[j][i]) break; if(i!=j) { for(k=0;k<=p+2;k++) swap(a[i][k],a[j][k]); } for(j=0;j<=p+1;j++) if(j!=i&&a[j][i]) { i64 tmp=a[j][i]*myPow(a[i][i],-1)%mod; for(k=0;k<=p+2;k++) a[j][k]=(a[j][k]-tmp*a[i][k])%mod; } } for(i=0;i<=p+1;i++) { A[i]=a[i][p+2]*myPow(a[i][i],-1)%mod; } } int d[1111][2]; int main() { scanf("%d%d",&p,&n); init(); int i; for(i=1;i<=n;i++) scanf("%d%d",&d[i][0],&d[i][1]); i64 ans=0; for(i=0;i<=p+1;i++) { i64 tmp=1; int j; for(j=1;j<=n;j++) { tmp=tmp*myPow(d[j][0],(i64)d[j][1]*i)%mod; tmp=tmp*(1-myPow(d[j][0],p-i))%mod; } ans+=A[i]*tmp%mod; } ans%=mod; if(ans<0) ans+=mod; printf("%lld ",ans); }