FWT裸题。
#include<cstdio>
#include<algorithm>
using namespace std;
#define LL long long
const int maxn=200010,p=1000000007,inv=500000004;
int a[maxn],prm[maxn],tot,n,m,l,t;
int inc(int x,int y)
{
x+=y;
return x>=p?x-p:x;
}
int dec(int x,int y)
{
x-=y;
return x<0?x+p:x;
}
int pow(int b,int k)
{
int r=1;
for (;k;k>>=1,b=(LL)b*b%p)
if (k&1) r=(LL)r*b%p;
return r;
}
void fwt(int l,int r)
{
if (l==r) return;
int mid=(l+r)/2,x,y;
for (int i=l,j=mid+1;i<=mid;i++,j++)
{
x=a[i];
y=a[j];
a[i]=inc(x,y);
a[j]=dec(x,y);
}
fwt(l,mid);
fwt(mid+1,r);
}
void ifwt(int l,int r)
{
if (l==r) return;
int mid=(l+r)/2,x,y;
for (int i=l,j=mid+1;i<=mid;i++,j++)
{
x=a[i];
y=a[j];
a[i]=(LL)inc(x,y)*inv%p;
a[j]=(LL)dec(x,y)*inv%p;
}
ifwt(l,mid);
ifwt(mid+1,r);
}
int main()
{
//freopen("e.in","r",stdin);
scanf("%d%d",&n,&m);
for (int i=2;i<=m;i++) a[i]=1;
for (int i=2;i<=m;i++)
{
if (a[i]) prm[++tot]=i;
for (int j=1;j<=tot&&i*prm[j]<=maxn;j++)
{
a[i*prm[j]]=0;
if (i%prm[j]==0) break;
}
}
l=1,t=0;
while (l<=m) l<<=1,t++;
fwt(0,l-1);
for (int i=0;i<l;i++) a[i]=pow(a[i],n);
ifwt(0,l-1);
printf("%d\n",a[0]);
}