题目名称 1888. [国家集训队 2011] Crash的文明世界
输入输出 civilization.in/out
难度等级 ★★★★
时间限制 5000 ms (5 s)
内存限制 512 MiB
测试数据 20
题目来源 Gravatarcstdio 于2014-12-17加入
开放分组 全部用户
提交状态
分类标签
动态规划 树分治 斯特林数
分享题解
通过:24, 提交:48, 通过率:50%
Gravatar神利·代目 100 1.887 s 30.33 MiB C++
GravatarAglove 100 2.036 s 30.16 MiB C++
GravatarStu.yxr 100 2.382 s 60.85 MiB C++
Gravatarlichang 100 2.409 s 60.69 MiB C++
Gravatar_Horizon 100 2.905 s 58.76 MiB C++
Gravatarjoooooel 100 2.992 s 43.55 MiB C++
Gravatargzy_cjoier 100 3.275 s 121.41 MiB C++
Gravatarassassain 100 3.330 s 62.58 MiB C++
Gravatarmikumikumi 100 3.635 s 62.22 MiB C++
Gravatar10001 100 3.799 s 65.06 MiB C++
关于 Crash的文明世界 的近10条评论(全部评论)
求该题的正确姿势
Gravatar哒哒哒哒哒!
2017-02-13 06:26 2楼
Gravatarcstdio
2015-07-05 15:23 1楼

1888. [国家集训队 2011] Crash的文明世界

★★★★   输入文件:civilization.in   输出文件:civilization.out   简单对比
时间限制:5 s   内存限制:512 MiB

【试题来源】

2011中国国家集训队命题答辩

【问题描述】

Crash小朋友最近迷上了一款游戏——文明5(Civilization V)。在这个游戏中,玩家可以建立和发展自己的国家,通过外交和别的国家交流,或是通过战争征服别的国家。
现在Crash已经拥有了一个N个城市的国家,这些城市之间通过道路相连。由于建设道路是有花费的,因此Crash只修建了N-1条道路连接这些城市,不过可以保证任意两个城市都有路径相通。
在游戏中,Crash需要选择一个城市作为他的国家的首都,选择首都需要考虑很多指标,有一个指标是这样的:

其中S(i)表示第i个城市的指标值,dist(i, j)表示第i个城市到第j个城市需要经过的道路条数的最小值,k为一个常数且为正整数。
因此Crash交给你一个简单的任务:给出城市之间的道路,对于每个城市,输出这个城市的指标值,由于指标值可能会很大,所以你只需要输出这个数mod10007的值。

【输入格式】

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

【输出格式】

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

【样例输入】

5 2
1 2
1 3
2 4
2 5

【样例输出】

10
7
23
18
18

【数据规模和约定】

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", N, k);
for (i = 1; i < N; i ++)
{
now = (now * A + B) % Q;
tmp = (i < L) ? i : L;
fprintf(outfile, "%d %d\n", i - now % tmp, i + 1);
}
}

Pascal版本:
procedure Uncompress(varinfile, 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