放模板
#include<bits/stdc++.h> #define N 100005 using namespace std; const int p = 1000000007; int t,n,m,ni; int pw(int x,int y) { int lst=1; while(y) { if(y&1)lst=1LL*lst*x%p; y>>=1; x=1LL*x*x%p; } return lst; } int pr[N],su[N],tot,a[N]; void shai() { for(int i=2;i<=m;i++) { if(!pr[i]) { su[++tot]=i; pr[i]=i; } for(int j=1;j<=tot&&su[j]*i<=m&&su[j]<=pr[i];j++) { pr[su[j]*i]=su[j]; } } return ; } void FWT(int f) { for(int i=1;i<n;i<<=1) { for(int j=0;j<n;j+=(i<<1)) { for(int k=0;k<i;k++) { int x=a[j+k],y=a[j+k+i]; a[j+k]=1LL*(x+y)%p*f%p; a[j+k+i]=1LL*(x-y+p)%p*f%p; } } } return ; } int main() { m=50000;shai(); while(~scanf("%d%d",&t,&m)) { memset(a,0,sizeof(a)); for(int i=1;i<=m;i++)if(pr[i]==i)a[i]=1; int l=0; n=1;ni=pw(2,p-2); while(n<=m)n<<=1,l++; FWT(1); for(int i=0;i<n;i++)a[i]=pw(a[i],t); FWT(ni); printf("%d ",a[0]); } return 0; }