记录编号 262261 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [HZOI 2015] 花样游戏 最终得分 100
用户昵称 Gravatarstdafx.h 是否通过 通过
代码语言 C++ 运行时间 0.232 s
提交时间 2016-05-19 21:32:52 内存使用 1.58 MiB
显示代码纯文本
#define maxn 150010ul

#include <stdio.h>

int K,L,tot,inv2,pr[maxn],pri[maxn];
const int mod=1e9+7;
bool isp[maxn];

int ksm(int p,int k){
	int ret=1;
	while(k){
		if(k&1) ret=1ll*ret*p%mod;
		k>>=1,p=1ll*p*p%mod;
	}
	return ret;
}

void fwt(int *a,int n){
	int u,t;
	for(int m=2;m<=n;m<<=1) for(int i=0;i<n;i+=m)
		for(int k=0,p=m>>1;k<p;k++) u=a[i+k],t=a[i+k+p],a[i+k]=(u+t)%mod,a[i+k+p]=(u-t)%mod;
	return;
}

void ifwt(int *a,int n){
	int u,t;
	for(int m=2;m<=n;m<<=1) for(int i=0;i<n;i+=m)
		for(int k=0,p=m>>1;k<p;k++) u=a[i+k],t=a[i+k+p],a[i+k]=1ll*(u+t)%mod*inv2%mod,a[i+k+p]=1ll*(u-t)%mod*inv2%mod;
	return;
}

int main(){
	freopen("srmnim.in","r",stdin);
	freopen("srmnim.out","w",stdout);
	scanf("%d%d",&K,&L),inv2=ksm(2,mod-2);
	for(int i=2;i<=L;i++){
		if(!isp[i]) pr[i]=1,pri[++tot]=i;
		for(int j=1;j<=tot&&pri[j]*i<=L;j++){
			isp[pri[j]*i]=true;
			if(i%pri[j]==0) break;
		}
	}
	int n=1;
	while(n<=L) n<<=1;
	fwt(pr,n);
	for(int i=0;i<n;i++) pr[i]=ksm(pr[i],K);
	ifwt(pr,n);
	printf("%d\n",(pr[0]%mod+mod)%mod);
	return 0;
}