记录编号 266719 评测结果 AAAAAAAAAA
题目名称 异化多肽 最终得分 100
用户昵称 Gravatarstdafx.h 是否通过 通过
代码语言 C++ 运行时间 3.321 s
提交时间 2016-06-09 10:50:19 内存使用 3.29 MiB
显示代码纯文本
#define maxn 262144ul

#include <stdio.h>
#include <string.h>
#include <algorithm>

const int G=5,mod=1005060097;

inline 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 ntt(int *f,int n,int flag){
	for(int i=0,j=0;i<n;i++){
		if(i>j) std::swap(f[i],f[j]);
		for(int t=n>>1;(j^=t)<t;t>>=1);
	} int u,t,wn,w;
	for(int m=2;m<=n;m<<=1){
		w=1,wn=ksm(G,flag==1?(mod-1)/m:(mod-1-(mod-1)/m));
		for(int i=0,p=m>>1;i<n;i+=m,w=1) for(int k=0;k<p;k++,w=1ll*w*wn%mod)
		    u=f[i+k],t=1ll*f[i+k+p]*w%mod,f[i+k]=(u+t)%mod,f[i+k+p]=(u-t)%mod;
	}
	if(flag==-1){
		int inv=ksm(n,mod-2);
		for(int i=0;i<n;i++) f[i]=1ll*f[i]*inv%mod;
	} return;
}

void poly_inv(int *f,int *g,int n){
	if(n==1){ g[0]=ksm(f[0],mod-2); return; }
	static int tmp[maxn];
	poly_inv(f,g,n>>1),memcpy(tmp,f,sizeof(f[0])*n);
	memset(tmp+n,0,sizeof(f[0])*n),ntt(tmp,n<<1,1),ntt(g,n<<1,1);
   	for(int i=0;i<(n<<1);i++) tmp[i]=1ll*g[i]*(2ll-1ll*g[i]*tmp[i]%mod)%mod;
    ntt(tmp,n<<1,-1); for(int i=0;i<n;i++) g[i]=tmp[i];
    memset(g+n,0,sizeof(g[0])*n); return;
}

int n,N,m,iv[maxn],rp[maxn];

void read(int &x){
	x=0; int c=getchar(); for(;c<'0'||c>'9';c=getchar());
	for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48); return;
}

int main(){
	freopen("polypeptide.in","r",stdin);
	freopen("polypeptide.out","w",stdout);
	read(n),read(m);
	for(int i=1,x;i<=m;i++) read(x),--iv[x]; iv[0]++;
	for(N=1;N<=n;N<<=1); poly_inv(iv,rp,N);
	printf("%d\n",(rp[n]%mod+mod)%mod); return 0;
}