人々の数に
所与\(N- \)素因数分解\(N = \ prod_ {私は= 1} ^ wp_i ^ {AI} \) 、全て未満を見つける(N- \)\と\(N- \)互いに素の正整数(\ M)\乗とダイ\(9 + 10 ^ 7 \)の値。前記\(^ P私は\)以上の素数ではありません(10 ^ 9 \)\。
\(^ I≤109、≤千ワット、M≤100 \) 。
問題の解決策
poly operator*(CO poly&a,CO poly&b){
int n=a.size()-1,m=b.size()-1;
poly ans(n+m+1);
for(int i=0;i<=n;++i)for(int j=0;j<=m;++j)
ans[i+j]=add(ans[i+j],mul(a[i],b[j]));
return ans;
}
poly operator/(poly a,CO poly&b){
int n=a.size()-1,m=b.size()-1;
poly ans(n-m+1);
int inv=fpow(b[m],mod-2);
for(int i=n;i>=m;--i){
ans[i-m]=mul(a[i],inv);
for(int j=i;j>=i-m;--j) a[j]=add(a[j],mod-mul(ans[i-m],b[j-(i-m)]));
}
return ans;
}
poly lagrange(int n,CO poly&x,CO poly&y){
poly ans(n+1),p={1};
for(int i=0;i<=n;++i) p=p*(poly){mod-x[i],1};
for(int i=0;i<=n;++i){
poly q=p/(poly){mod-x[i],1};
int c=1;
for(int j=0;j<=n;++j)if(j!=i) c=mul(c,add(x[i],mod-x[j]));
c=mul(fpow(c,mod-2),y[i]);
for(int j=0;j<=n;++j) ans[j]=add(ans[j],mul(c,q[j]));
}
return ans;
}
CO int N=1e3+10;
int p[N],a[N];
int main(){
int m=read<int>();
poly x(m+2),y(m+2);
x[0]=0,y[0]=0;
for(int i=1;i<=m+1;++i) x[i]=i,y[i]=add(y[i-1],fpow(i,m));
poly f=lagrange(m+1,x,y);
int w=read<int>();
for(int i=1;i<=w;++i) read(p[i]),read(a[i]);
int ans=0;
for(int i=0;i<=m+1;++i){
int sum=f[i];
for(int j=1;j<=w;++j){
int x=fpow(p[j],(int64)a[j]*i%(mod-1));
x=add(x,mod-fpow(p[j],(m+(int64)(a[j]-1)*i)%(mod-1)));
sum=mul(sum,x);
}
ans=add(ans,sum);
}
printf("%d\n",ans);
return 0;
}