并不知道为啥是对的
屯板子
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define N 200010
#define lint long long
#define mod 1000000007
#define inv2 500000004
using namespace std;
bool isp[N];int a[N],ans[N],t1[N],t2[N];
int fwt(int *a,int n)
{
for(int i=1;i<n;i<<=1)
for(int j=0,p=i<<1;j<n;j+=p)
for(int k=0,x,y;k<i;k++)
x=a[j+k],y=a[j+k+i],a[j+k]=(x+y)%mod,a[j+k+i]=(x-y+mod)%mod;
//and a[j+k]=x+y
//or a[j+k+i]=x+y
return 0;
}
int ufwt(int *a,int n)
{
for(int i=1;i<n;i<<=1)
for(int j=0,p=i<<1;j<n;j+=p)
for(int k=0,x,y;k<i;k++)
x=a[j+k],y=a[j+k+i],
a[j+k]=(lint)inv2*(x+y)%mod,a[j+k+i]=(lint)inv2*(x-y+mod)%mod;
//and a[j+k]=x-y
//or a[j+k+i]=y-x
return 0;
}
inline int get_ans(int *a,int *ans,int n,int k)
{
fwt(ans,n),fwt(a,n);
while(k)
{
if(k&1) for(int i=0;i<n;i++) ans[i]=(lint)ans[i]*a[i]%mod;
for(int i=0;i<n;i++) a[i]=(lint)a[i]*a[i]%mod;k>>=1;
}
return ufwt(ans,n);
}
int main()
{
int n,m=50000;
for(int i=2;i<=m;i++) isp[i]=true;
for(int i=2;i<=m;i++) if(isp[i])
for(int j=i;(lint)i*j<=m;j++) isp[i*j]=false;
while(scanf("%d%d",&n,&m)!=EOF&&(n||m))
{
int L=1;while(L<=m) L<<=1;
for(int i=0;i<L;i++) a[i]=0;
for(int i=1;i<=m;i++) a[i]=isp[i];
for(int i=0;i<L;i++) ans[i]=0;ans[0]=1;
get_ans(a,ans,L,n),printf("%d\n",ans[0]);
}
return 0;
}