记录编号 |
143944 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[国家集训队 2011] Crash的文明世界 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
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;
}