HDU 5860 Death Sequence(递推)
HDU 5860 Death Sequence(递推)
题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5860
Description
You may heard of the Joseph Problem, the story comes from a Jewish historian living in 1st century. He and his 40 comrade soldiers were trapped in a cave, the exit of which was blocked by Romans. They chose suicide over capture and decided that they would form a circle and start killing themselves using a step of three. Josephus states that by luck or maybe by the hand of God, he and another man remained the last and gave up to the Romans.
Now the problem is much easier: we have N men stand in a line and labeled from 1 to N, for each round, we choose the first man, the k+1-th one, the 2*k+1-th one and so on, until the end of the line. These poor guys will be kicked out of the line and we will execute them immediately (may be head chop, or just shoot them, whatever), and then we start the next round with the remaining guys. The little difference between the Romans and us is, in our version of story, NO ONE SURVIVES. Your goal is to find out the death sequence of the man.
For example, we have N = 7 prisoners, and we decided to kill every k=2 people in the line. At the beginning, the line looks like this:
1 2 3 4 5 6 7after the first round, 1 3 5 7 will be executed, we have2 4 6and then, we will kill 2 6 in the second round. At last 4 will be executed. So, you need to output 1 3 5 7 2 6 4. Easy, right?
But the output maybe too large, we will give you Q queries, each one contains a number m, you need to tell me the m-th number in the death sequence.
Input
Multiple cases. The first line contains a number T, means the number of test case. For every case, there will be three integers N (1<=N<=3000000), K(1<=K), and Q(1<=Q<=1000000), which indicate the number of prisoners, the step length of killing, and the number of query. Next Q lines, each line contains one number m(1<=m<=n).
Output
For each query m, output the m-th number in the death sequence.
Sample Input
1
7 2 7
1
2
3
4
5
6
7
Sample Output
1
3
5
7
2
6
4
题意:
给你n个人排成一列编号,每次杀第一个人第i×k+1个人一直杀到没的杀。然后剩下的人重新编号从1~剩余的人数。按照上面的方式杀。问第几次杀的是谁。
题解:
这道题首先我们先将编号改成从0开始。这样如果i%k0那么我们可以知道第i个数字第一轮就被杀死。如果i%k!=0,那么我们知道在这之前一轮杀死了i/k+1个人。这样我们就得到递推式。
定义dp[i]代表第i轮杀死多少人。num[i]表示i在当前轮第几个被杀死。
对于i%k0我们可以知道第一轮被杀死,所以dp[i]=0,num[i]=i/k+1。
对于i%k!=0通过前面我们知道他们的状态和i-i/k-1有关。故dp[i]=dp[i-i/k-1]+1,num[i]=num[i-i/k-1]。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3001000;
int dp[maxn],num[maxn],add[maxn],ans[maxn];
int n,k,q;
void init()
{
int temp = n;
int acl = 0;
add[0] = 0; //add[i]前i轮kill几个;
while (temp){
acl++;
add[acl] = add[acl-1] + (temp-1)/k+1;
temp -= (temp-1)/k+1;
}
for (int i = 0; i < n; i++){
if (i%k == 0){
dp[i] = 0;
num[i] = i/k+1;
}else {
dp[i] = dp[i-i/k-1] + 1;
num[i] = num[i-i/k-1];
}
}
for (int i = 0; i < n; i++){
ans[add[dp[i]]+num[i]] = i;
}
}
int main()
{
int t;
scanf("%d",&t);
while (t--){
scanf("%d %d %d",&n,&k,&q);
init();
int cha;
while (q--){
scanf("%d",&cha);
printf("%d\n",ans[cha]+1);
}
}
return 0;
}
HDU 5860 Death Sequence(递推)的更多相关文章
- hdu 5860 Death Sequence(递推+脑洞)
Problem Description You may heard of the Joseph Problem, the story comes from a Jewish historian liv ...
- HDU 5860 Death Sequence(死亡序列)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- HDU 5950 Recursive sequence 递推转矩阵
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- hdu 5950 Recursive sequence 递推式 矩阵快速幂
题目链接 题意 给定\(c_0,c_1,求c_n(c_0,c_1,n\lt 2^{31})\),递推公式为 \[c_i=c_{i-1}+2c_{i-2}+i^4\] 思路 参考 将递推式改写\[\be ...
- 2016 Multi-University Training Contest 10 || hdu 5860 Death Sequence(递推+单线约瑟夫问题)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5860 题目大意:给你n个人排成一列编号,每次杀第一个人第i×k+1个人一直杀到没的杀.然后 ...
- HDU 5860 Death Sequence
用线段树可以算出序列.然后o(1)询问. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<c ...
- HDU 2085 核反应堆 --- 简单递推
HDU 2085 核反应堆 /* HDU 2085 核反应堆 --- 简单递推 */ #include <cstdio> ; long long a[N], b[N]; //a表示高能质点 ...
- hdu-5496 Beauty of Sequence(递推)
题目链接: Beauty of Sequence Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java ...
- hdu 2604 Queuing(dp递推)
昨晚搞的第二道矩阵快速幂,一开始我还想直接套个矩阵上去(原谅哥模板题做多了),后来看清楚题意后觉得有点像之前做的数位dp的水题,于是就用数位dp的方法去分析,推了好一会总算推出它的递推关系式了(还是菜 ...
随机推荐
- 把虚拟机中的Linux系统安装到U盘中
[小技巧] 把虚拟机中的Linux系统安装到U盘中 出于各种需求,很多用户可能经常会在Windows系统中安装虚拟机,然后在虚拟机中安装Linux系统.使用虚拟机的优点是可以同时使用多个系统,而缺点也 ...
- Android消息推送之GCM方式(一)
<声明> 转载请保留本来源地址: http://blog.csdn.net/wzg_1987/article/details/9140371 首先,你需要使用一个谷歌账号登录谷歌Api控制 ...
- data矩阵poj 2778 DNA Sequence
最近研究data矩阵,稍微总结一下,以后继续补充: ac自动机处理字符串,dp计算谜底,用矩阵来减速 每日一道理 巴尔扎克说过“不幸,是天才的进升阶梯,信徒的洗礼之水,弱者的无底深渊”.风雨过 ...
- 关于javascript变量作用域的研究。
开始 一个变量的作用域(scope)是程序源代码中定义这个变量的区域.全局变量具有全局作用域,在javascript中的任何地方都是有定义的.然而在函数内申明的变量只在函数体内有定义.他们是局部变量, ...
- C语言之字符集、ASCII码和sizeof运算符
一 字符集和ASCII码 结论:字符本质上也是一个整数,每个字符都有唯一一个与之对应的整数, 比如说小写的a对应97,b对应98,c对应99,大写的A对应65,B对应66,C对应67 所以字符对应的那 ...
- java基础练习 10
import java.util.Scanner; public class Tenth { /*有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数*/ public stati ...
- hdu1046
#include<iostream> #include<cmath> using namespace std; int main() { int T,t=0,m,n; cin& ...
- The Linux Mint 18.1:Eclipse Run The C++ And Python ConfigorationWhen You achieve above step,you can run the c++ and python! (Next OTL ,PYOTL is Project That Write By Ruimin Shen(ability man) )
# Copyright (c) 2016, 付刘伟 (Liuwei Fu)# All rights reserved.# 转载请注明出处 1.Install The Eclipse,g++ Use T ...
- JS 多个参数的传递
var link = $("<a/>", { href: '/StandardManagement/StandardActivitiesDetail?' + $.par ...
- Linux上传与下载(sz-rz)
linux使用rz和sz命令上传和下载文件! sz命令发送文件到本地: # sz filename rz命令本地上传文件到服务器: # rz 执行该命令后,在弹出框中选择要上传的文件即可. 说明:打开 ...
题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5860
Description
You may heard of the Joseph Problem, the story comes from a Jewish historian living in 1st century. He and his 40 comrade soldiers were trapped in a cave, the exit of which was blocked by Romans. They chose suicide over capture and decided that they would form a circle and start killing themselves using a step of three. Josephus states that by luck or maybe by the hand of God, he and another man remained the last and gave up to the Romans.
Now the problem is much easier: we have N men stand in a line and labeled from 1 to N, for each round, we choose the first man, the k+1-th one, the 2*k+1-th one and so on, until the end of the line. These poor guys will be kicked out of the line and we will execute them immediately (may be head chop, or just shoot them, whatever), and then we start the next round with the remaining guys. The little difference between the Romans and us is, in our version of story, NO ONE SURVIVES. Your goal is to find out the death sequence of the man.
For example, we have N = 7 prisoners, and we decided to kill every k=2 people in the line. At the beginning, the line looks like this:
1 2 3 4 5 6 7after the first round, 1 3 5 7 will be executed, we have2 4 6and then, we will kill 2 6 in the second round. At last 4 will be executed. So, you need to output 1 3 5 7 2 6 4. Easy, right?
But the output maybe too large, we will give you Q queries, each one contains a number m, you need to tell me the m-th number in the death sequence.
Input
Multiple cases. The first line contains a number T, means the number of test case. For every case, there will be three integers N (1<=N<=3000000), K(1<=K), and Q(1<=Q<=1000000), which indicate the number of prisoners, the step length of killing, and the number of query. Next Q lines, each line contains one number m(1<=m<=n).
Output
For each query m, output the m-th number in the death sequence.
Sample Input
1
7 2 7
1
2
3
4
5
6
7
Sample Output
1
3
5
7
2
6
4
题意:
给你n个人排成一列编号,每次杀第一个人第i×k+1个人一直杀到没的杀。然后剩下的人重新编号从1~剩余的人数。按照上面的方式杀。问第几次杀的是谁。
题解:
这道题首先我们先将编号改成从0开始。这样如果i%k0那么我们可以知道第i个数字第一轮就被杀死。如果i%k!=0,那么我们知道在这之前一轮杀死了i/k+1个人。这样我们就得到递推式。
定义dp[i]代表第i轮杀死多少人。num[i]表示i在当前轮第几个被杀死。
对于i%k0我们可以知道第一轮被杀死,所以dp[i]=0,num[i]=i/k+1。
对于i%k!=0通过前面我们知道他们的状态和i-i/k-1有关。故dp[i]=dp[i-i/k-1]+1,num[i]=num[i-i/k-1]。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3001000;
int dp[maxn],num[maxn],add[maxn],ans[maxn];
int n,k,q;
void init()
{
int temp = n;
int acl = 0;
add[0] = 0; //add[i]前i轮kill几个;
while (temp){
acl++;
add[acl] = add[acl-1] + (temp-1)/k+1;
temp -= (temp-1)/k+1;
}
for (int i = 0; i < n; i++){
if (i%k == 0){
dp[i] = 0;
num[i] = i/k+1;
}else {
dp[i] = dp[i-i/k-1] + 1;
num[i] = num[i-i/k-1];
}
}
for (int i = 0; i < n; i++){
ans[add[dp[i]]+num[i]] = i;
}
}
int main()
{
int t;
scanf("%d",&t);
while (t--){
scanf("%d %d %d",&n,&k,&q);
init();
int cha;
while (q--){
scanf("%d",&cha);
printf("%d\n",ans[cha]+1);
}
}
return 0;
}
Problem Description You may heard of the Joseph Problem, the story comes from a Jewish historian liv ...
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
题目链接 题意 给定\(c_0,c_1,求c_n(c_0,c_1,n\lt 2^{31})\),递推公式为 \[c_i=c_{i-1}+2c_{i-2}+i^4\] 思路 参考 将递推式改写\[\be ...
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5860 题目大意:给你n个人排成一列编号,每次杀第一个人第i×k+1个人一直杀到没的杀.然后 ...
用线段树可以算出序列.然后o(1)询问. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<c ...
HDU 2085 核反应堆 /* HDU 2085 核反应堆 --- 简单递推 */ #include <cstdio> ; long long a[N], b[N]; //a表示高能质点 ...
题目链接: Beauty of Sequence Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java ...
昨晚搞的第二道矩阵快速幂,一开始我还想直接套个矩阵上去(原谅哥模板题做多了),后来看清楚题意后觉得有点像之前做的数位dp的水题,于是就用数位dp的方法去分析,推了好一会总算推出它的递推关系式了(还是菜 ...
[小技巧] 把虚拟机中的Linux系统安装到U盘中 出于各种需求,很多用户可能经常会在Windows系统中安装虚拟机,然后在虚拟机中安装Linux系统.使用虚拟机的优点是可以同时使用多个系统,而缺点也 ...
<声明> 转载请保留本来源地址: http://blog.csdn.net/wzg_1987/article/details/9140371 首先,你需要使用一个谷歌账号登录谷歌Api控制 ...
最近研究data矩阵,稍微总结一下,以后继续补充: ac自动机处理字符串,dp计算谜底,用矩阵来减速 每日一道理 巴尔扎克说过“不幸,是天才的进升阶梯,信徒的洗礼之水,弱者的无底深渊”.风雨过 ...
开始 一个变量的作用域(scope)是程序源代码中定义这个变量的区域.全局变量具有全局作用域,在javascript中的任何地方都是有定义的.然而在函数内申明的变量只在函数体内有定义.他们是局部变量, ...
一 字符集和ASCII码 结论:字符本质上也是一个整数,每个字符都有唯一一个与之对应的整数, 比如说小写的a对应97,b对应98,c对应99,大写的A对应65,B对应66,C对应67 所以字符对应的那 ...
import java.util.Scanner; public class Tenth { /*有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数*/ public stati ...
#include<iostream> #include<cmath> using namespace std; int main() { int T,t=0,m,n; cin& ...
# Copyright (c) 2016, 付刘伟 (Liuwei Fu)# All rights reserved.# 转载请注明出处 1.Install The Eclipse,g++ Use T ...
var link = $("<a/>", { href: '/StandardManagement/StandardActivitiesDetail?' + $.par ...
linux使用rz和sz命令上传和下载文件! sz命令发送文件到本地: # sz filename rz命令本地上传文件到服务器: # rz 执行该命令后,在弹出框中选择要上传的文件即可. 说明:打开 ...