• bzoj 2159: Crash 的文明世界


    2159: Crash 的文明世界

    Time Limit: 10 Sec  Memory Limit: 259 MB
    Submit: 478  Solved: 233
    [Submit][Status][Discuss]

    Description

    Crash 小朋友最近迷上了一款游戏——文明5(Civilization V)。在这个游戏中,玩家可以建立和发展自己的国家,通过外交和别的国家交流,或是通过战争征服别的国家。现在Crash 已经拥有了一个N 个城市的国家,这些城市之间通过道路相连。由于建设道路是有花费的,因此Crash 只修建了N-1 条道路连接这些城市,不过可以保证任意两个城市都有路径相通。在游戏中,Crash 需要选择一个城市作为他的国家的首都,选择首都需要考虑很多指标,有一个指标是这样的:  其中S(i)表示第i 个城市的指标值,dist(i, j)表示第i 个城市到第j 个城市需要经过的道路条数的最小值,k 为一个常数且为正整数。因此Crash 交给你一个简单的任务:给出城市之间的道路,对于每个城市,输出这个城市的指标值,由于指标值可能会很大,所以你只需要输出这个数mod 10007 的值。

    Input

    输入的第一行包括两个正整数N 和k。下面有N-1 行,每行两个正整数u、v (1 ≤ u, v ≤ N),表示第u 个城市和第v 个城市之间有道路相连。这些道路保证能符合题目的要求。

    Output

    输出共N 行,每行一个正整数,第i 行的正整数表示第i 个城市的指标值 mod 10007 的值。

    Sample Input

    5 2
    1 2
    1 3
    2 4
    2 5

    Sample Output

    10
    7
    23
    18
    18

    HINT

    20%的数据满足N ≤ 5000、k ≤ 30。 50%的数据满足N ≤ 50000、k ≤ 30。 100%的数据满足N ≤ 50000、k ≤ 150。 【特别注意】由于数据大小限制为5MB,我只好对测试时的输入文件进行压缩处理。下面的函数可以将压缩的输入文件转化为原始输入文件。(函数从infile 中读入压缩的输入文件,将解压缩后的输入文件输出到outfile 中) C/C++版本: void Uncompress(FILE *infile, FILE *outfile) { int N, k, L, i, now, A, B, Q, tmp; fscanf(infile, "%d%d%d", &N, &k, &L); fscanf(infile, "%d%d%d%d", &now, &A, &B, &Q); fprintf(outfile, "%d %d ", N, k); for (i = 1; i < N; i ++) { now = (now * A + B) % Q; tmp = (i < L) ? i : L; fprintf(outfile, "%d %d ", i - now % tmp, i + 1); } } Pascal 版本: procedure Uncompress(var infile, outfile : text); var N, k, L, i, now, A, B, Q, tmp : longint; begin read(infile, N, k, L, now, A, B, Q); writeln(outfile, N, ' ', k); for i := 1 to N - 1 do begin now := (now * A + B) mod Q; if i < L then tmp := i else tmp := L; writeln(outfile, i - now mod tmp, ' ', i + 1); end; end; 下面给出一个具体的例子。civiliazation_compressed.in 表示压缩的输入文件, civilization.in 表示解压缩后的输入文件。 civilization_compressed.in 7 26 4 29643 2347 5431 54209 civilization.in 7 26 1 2 2 3 2 4 3 5 4 6 5 7



    2016.2.19重设时限为10s

    http://blog.csdn.net/qq_33229466/article/details/73065525

    https://www.cnblogs.com/clrs97/p/5192524.html

    最终答案的计算方法为

    $LARGE ans=sum ^{m}_{j=1}Sleft( m,j ight) imes j! imes sum ^{n}_{k=1}Cleft( distleft( i,t ight) ,j ight)$

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #define maxn 50010
    #define mod 10007
    using namespace std;
    int n,m,num,L,now,A,B,Q,head[maxn],f[maxn][155],g[maxn][155],s[155][155],fac[155];
    struct node{int to,pre;}e[maxn*2];
    void Insert(int from,int to){
        e[++num].to=to;
        e[num].pre=head[from];
        head[from]=num;
    }
    void ad(int &x,int y){x+=y;if(x>=mod)x-=mod;}
    void dl(int &x,int y){x-=y;if(x<mod)x+=mod;}
    void dfs1(int x,int fa){
        f[x][0]=1;
        for(int i=head[x];i;i=e[i].pre){
            int to=e[i].to;
            if(to==fa)continue;
            dfs1(to,x);ad(f[x][0],f[to][0]);
            for(int i=1;i<=m;i++)ad(f[x][i],(f[to][i]+f[to][i-1])%mod);
        }
    }
    void dfs2(int x,int fa){
        if(fa){
            g[x][0]=n-f[x][0];
            for(int i=1;i<=m;i++){
                ad(g[x][i],((g[fa][i]+g[fa][i-1]+f[fa][i]+f[fa][i-1]-f[x][i]-(f[x][i-1]<<1))%mod+mod)%mod);  
                if(i>1)dl(g[x][i],f[x][i-2]);
            }
        }
        for(int i=head[x];i;i=e[i].pre){
            int to=e[i].to;
            if(to!=fa)dfs2(to,x);
        }
    }
    int main(){
        scanf("%d%d%d%d%d%d%d",&n,&m,&L,&now,&A,&B,&Q);
        int x,y,tmp;
        for(int i=1;i<n;i++){
            now=(now*A+B)%Q;tmp=min(i,L);
            x=i-now%tmp;y=i+1;
            Insert(x,y);Insert(y,x);
        }
        s[0][0]=1;
        for(int i=1;i<=m;i++)
            for(int j=1;j<=i;j++)
                s[i][j]=(s[i-1][j]*j+s[i-1][j-1])%mod;
        fac[1]=1;
        for(int i=2;i<=m;i++)fac[i]=fac[i-1]*i%mod;
        dfs1(1,0);dfs2(1,0);
        for(int i=1;i<=n;i++){
            x=0;
            for(int j=1;j<=m;j++)ad(x,s[m][j]*fac[j]%mod*(f[i][j]+g[i][j])%mod);
            printf("%d
    ",x);
        }
        return 0;
    }
  • 相关阅读:
    Java第七次作业
    JAVA第六次作业
    JAVA第五次作业
    JAVA第四次作业
    JAVA第三次作业
    JAVA第二次作业
    Java第一次作业
    2017《Java》预备作业02 计科1501刘喆
    2017《JAVA》预备作业 计科1501刘喆
    Java第十次作业--多线程
  • 原文地址:https://www.cnblogs.com/thmyl/p/8214983.html
Copyright © 2020-2023  润新知