记录编号 143944 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队 2011] Crash的文明世界 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 3.837 s
提交时间 2014-12-19 07:37:00 内存使用 62.22 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int SIZEN=50010,SIZEK=160,MOD=10007;
int N,K;
vector<int> c[SIZEN];
int fa[SIZEN]={0};
class State{
public:
	int s[SIZEK];//s[i]代表C(x,i)的总和
	void clear(void){memset(s,0,sizeof(s));}
	State(){clear();}
	void operator += (State &t){
		for(int i=0;i<=K;i++) s[i]=(s[i]+t.s[i])%MOD;
	}
	void operator -= (State &t){
		for(int i=0;i<=K;i++) s[i]=(s[i]+MOD-t.s[i])%MOD;
	}
	void makestep(void){//一步
		for(int i=K;i>0;i--) s[i]=(s[i]+s[i-1])%MOD;
	}
};
State down[SIZEN];
State f[SIZEN];
void DFS_f(int x){
	f[x]+=down[x];
	for(int i=0;i<c[x].size();i++){
		int u=c[x][i];
		if(u==fa[x]) continue;
		static State tp;
		tp=f[x];tp.makestep();
		f[u]+=tp;
		tp=down[u];tp.makestep();tp.makestep();
		f[u]-=tp;
		DFS_f(u);
	}
}
void DFS_down(int x){
	down[x].s[0]=1;//到自己的距离为0
	for(int i=0;i<c[x].size();i++){
		int u=c[x][i];
		if(u==fa[x]) continue;
		fa[u]=x;
		DFS_down(u);
		static State tp;
		tp=down[u];tp.makestep();
		down[x]+=tp;
	}
}
int S[SIZEK][SIZEK]={0};
int frac[SIZEK]={0};
void prepare(void){
	for(int i=1;i<=K;i++){
		S[i][1]=S[i][i]=1;
		for(int j=2;j<i;j++)
			S[i][j]=(S[i-1][j-1]+j*S[i-1][j])%MOD;
	}
	frac[0]=1;
	for(int i=1;i<=K;i++) frac[i]=(frac[i-1]*i)%MOD;
}
void answer(int x){
	int ans=0;
	for(int i=1;i<=K;i++){
		int now=(S[K][i]*frac[i])%MOD;
		ans+=(now*f[x].s[i])%MOD;
		ans%=MOD;
	}
	printf("%d\n",ans);
}
void work(void){
	for(int i=1;i<=N;i++) answer(i);
}
void read(void){
	int L,now,A,B,Q,tmp;
	scanf("%d%d",&N,&K);
	scanf("%d%d%d%d%d",&L,&now,&A,&B,&Q);
	for(int i=1;i<N;i++){
		now=(now*A+B)%Q;
		tmp=(i<L)?i:L;
		int u=i-now%tmp,v=i+1;
		c[u].push_back(v);
		c[v].push_back(u);
	}
}
int main(){
	freopen("civilization.in","r",stdin);
	freopen("civilization.out","w",stdout);
	read();
	prepare();
	DFS_down(1);
	DFS_f(1);
	work();
	return 0;
}