2159: Crash 的文明世界

2023-10-20 12:50
文章标签 世界 crash 文明 2159

本文主要是介绍2159: Crash 的文明世界,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


2159: Crash 的文明世界

Time Limit: 10 Sec   Memory Limit: 259 MB
Submit: 548   Solved: 256
[ 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", 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(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


恕我直言,我还是第一次见这么奇葩的题目描述

都告诉了输入格式,结果最后给你来一团像乱码一样的东西告诉你这才是真正的输入格式...

就这,我re了两次.... 辣鸡题面,降我ac率(掀桌


看到i^k这种格式,以及该题性质,会想到第二类斯特林数.

其中表示第二类斯特林数.

第二类斯特林数表示把i个数分成j个无序集合的个数.

那么


因为单考虑第i个数,可以把这个数分别放入前j-1个集合有j-1种方案,还可以单独一个集合 1种方案

而c是可以递推的,令f[i][j]表示在第i个点disi为j的和

那么对于一个点x,他所能到达更远的所有点一定是能到他的距离+ 1 那么可以直接用组合数算出来

那么考虑从叶子节点向上递推可以算出根节点f值。

然后再从根节点向下推,此时要注意原本从某个点转移过来的方案数.

另外因为有减法,还要 + p再 % p

c++代码如下:

#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i = x; i <= y;++ i)
#define repd(i,x,y) for(register int i = x; i >= y;-- i)
using namespace std;
typedef long long ll;
template<typename T>inline void read(T&x)
{x = 0;char c;int sign = 1;do { c = getchar(); if(c == '-') sign = -1; }while(!isdigit(c));do { x = x * 10 + c - '0'; c = getchar(); }while(isdigit(c));x *= sign;
}const int p = 1e4+7,N = 5e4+500,K = 155;
int s[K][K],f[N][K],ans[N],out[N],fa[N],F[K],t[K],n,k;
int head[N],nxt[N<<1],to[N<<1],tot;inline void add(int x,int y)
{to[tot] = y;nxt[tot] = head[x];head[x] = tot++;
}void dfs(int x)
{for(register int i = head[x];~i;i = nxt[i])if(to[i] != fa[x]){fa[to[i]] = x;out[x] ++;dfs(to[i]);}
}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);} 
}int main()
{memset(head,-1,sizeof head);int L,now,tmp,A,B,Q;read(n); read(k); read(L);read(now); read(A); read(B); read(Q); rep(i,1,n - 1){int u,v;now = (now * A + B) % Q;tmp = (i < L) ? i : L;u = i - now % tmp,v = i + 1;add(u,v); add(v,u);}dfs(1);F[1] = 1;rep(i,2,k) F[i] = 1LL*F[i - 1]*i%p;s[0][0] = 1;rep(i,1,k)rep(j,0,i)if(j) s[i][j] = (1LL*s[i - 1][j] * j % p + s[i - 1][j - 1]) % p; else s[i][j] = 1LL*s[i - 1][j] * j % p;queue<int>q;rep(i,1,n) if(!out[i]) q.push(i);while(!q.empty()){int x = q.front();q.pop();f[x][0]++;int y = fa[x];if(y){out[y] --;if(!out[y]) q.push(y); rep(i,0,k)if(i) f[y][i] = (f[y][i] + f[x][i - 1] + f[x][i]) % p;else f[y][i] = (f[y][i] + f[x][i])%p;}}q.push(1);while(!q.empty()){int x = q.front();q.pop();rep(i,1,k)ans[x] = (1LL*s[k][i] * F[i] % p * f[x][i] % p + ans[x])%p;for(register int i = head[x];~i;i = nxt[i])if(to[i] != fa[x]){rep(j,0,k)if(j == 0) t[j] = f[x][j];else if(j == 1) t[j] = ((f[to[i]][j] + f[x][j] + f[x][j - 1] - (f[to[i]][j] + f[to[i]][j - 1]) - f[to[i]][j - 1])%p+p)%p;else t[j] = ((f[to[i]][j] + f[x][j] + f[x][j - 1] - (f[to[i]][j] + f[to[i]][j - 1]) - (f[to[i]][j - 1] + f[to[i]][j - 2]))%p + p)%p;memcpy(f[to[i]],t,sizeof t);q.push(to[i]);}}rep(i,1,n) printf("%d\n",ans[i]);return 0;
}

这篇关于2159: Crash 的文明世界的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/247204

相关文章

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的KML矢量数据分析分享给大家,如果你需要这些数据,请在文末查看领取方式。 世界上横跨两大洲的国家 地球被分为七个大洲分别是亚洲、欧洲、北美洲、南美洲、非洲、大洋洲和南极洲。 七大洲示意图 其中,南极洲是无人居住的大陆,而其他六个大洲则孕育了众多国家和

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能

简单的Q-learning|小明的一维世界(3)

简单的Q-learning|小明的一维世界(1) 简单的Q-learning|小明的一维世界(2) 一维的加速度世界 这个世界,小明只能控制自己的加速度,并且只能对加速度进行如下三种操作:增加1、减少1、或者不变。所以行动空间为: { u 1 = − 1 , u 2 = 0 , u 3 = 1 } \{u_1=-1, u_2=0, u_3=1\} {u1​=−1,u2​=0,u3​=1}

简单的Q-learning|小明的一维世界(2)

上篇介绍了小明的一维世界模型 、Q-learning的状态空间、行动空间、奖励函数、Q-table、Q table更新公式、以及从Q值导出策略的公式等。最后给出最简单的一维位置世界的Q-learning例子,从给出其状态空间、行动空间、以及稠密与稀疏两种奖励函数的设置方式。下面将继续深入,GO! 一维的速度世界 这个世界,小明只能控制自己的速度,并且只能对速度进行如下三种操作:增加1、减

【Linux】萌新看过来!一篇文章带你走进Linux世界

🚀个人主页:奋斗的小羊 🚀所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 前言💥1、初识Linux💥1.1 什么是操作系统?💥1.2 各种操作系统对比💥1.3 现代Linux应用💥1.4 Linux常用版本 💥2、Linux 和 Windows 目录结构对比💥2.1 文件系统组织方式💥2.2

Elasticsearch:无状态世界中的数据安全

作者:来自 Elastic Henning Andersen 在最近的博客文章中,我们宣布了支持 Elastic Cloud Serverless 产品的无状态架构。通过将持久性保证和复制卸载到对象存储(例如 Amazon S3),我们获得了许多优势和简化。 从历史上看,Elasticsearch 依靠本地磁盘持久性来确保数据安全并处理陈旧或孤立的节点。在本博客中,我们将讨论无状态的数据持

【AI大模型应用开发】2.1 Function Calling连接外部世界 - 入门与实战(1)

Function Calling是大模型连接外部世界的通道,目前出现的插件(Plugins )、OpenAI的Actions、各个大模型平台中出现的tools工具集,其实都是Function Calling的范畴。时下大火的OpenAI的GPTs,原理就是使用了Function Calling,例如联网检索、code interpreter。 本文带大家了解下Function calling,看

005:VTK世界坐标系中的相机和物体

VTK医学图像处理---世界坐标系中的相机和物体 左侧是成像结果                                                    右侧是世界坐标系中的相机与被观察物体 目录 VTK医学图像处理---世界坐标系中的相机和物体 简介 1 在三维空间中添加坐标系 2 世界坐标系中的相机 3 世界坐标系中vtkImageData的参数 总结:

深入RabbitMQ世界:探索3种队列、4种交换机、7大工作模式及常见概念

文章目录 文章导图RabbitMQ架构及相关概念四大核心概念名词解读 七大工作模式及四大交换机类型0、前置了解-默认交换机DirectExchange1、简单模式(Simple Queue)-默认DirectExchange2、 工作队列模式(Work Queues)-默认DirectExchange3、发布/订阅模式(Publish/Subscribe)-FanoutExchange4、路

攻防世界 unseping

unseping 攻防世界web新手练习 -unseping_攻防世界web新手题unseping-CSDN博客 这道题对我来说还是有点难,什么oct绕过命令执行第一次遇到捏,所以基本是跟着别人的wp写的,一点点记录吧 先对源码进行分析 <?phphighlight_file(__FILE__);//定义了一个ease类class ease{private $method;privat