HDU5860 (递推)
Problem Death Sequence
题目大意
排成一行的约瑟夫问题。
n个人排成一行,从第一个人开始,每个k个人报数,报到数的人被杀死,剩下的人重新排成一行再报数。
一共q个询问,每次询问第qi个死的人是谁。
n <= 3000000 , q <= 1000000 , k>=1 。
解题分析
显然每一轮游戏可以看做是一个子问题。
假设编号为0~n-1,若某轮中某人的编号为i,如果i被k整除则被杀,否则在下轮中编号为i-i/k-1。
dp[i]表示编号为i的人可以存活几轮,那么dp[i]=i % k ? dp[i-i/k-1] : 0 。
再用一个数组s[i]记录一下前i轮一共死了多少人。
这样就可以在O(n)时间内预处理出一个答案序列。
参考程序
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<iomanip>
#include<vector>
#include<set>
#include<map>
#include<queue> using namespace std;
typedef long long LL;
typedef unsigned long long ULL; #define rep(i,k,n) for(int i=(k);i<=(n);i++)
#define rep0(i,n) for(int i=0;i<(n);i++)
#define red(i,k,n) for(int i=(k);i>=(n);i--)
#define sqr(x) ((x)*(x))
#define clr(x,y) memset((x),(y),sizeof(x))
#define pb push_back
#define mod 1000000007 const int maxn=;
int n,k,q,tot;
int f[maxn],s[maxn],ans[maxn],a[maxn]; void init()
{
int tmp=n;
tot=;
s[]=;
while(tmp)
{
tot++;
s[tot]=s[tot-]+(tmp-)/k+;
tmp-=(tmp-)/k+;
}
f[]=;
rep(i,,n-){
f[i]= i % k ? f[i-i/k-]+ : ;
a[i]= i % k ? a[i-i/k-] : i/k+;
}
rep(i,,n-){
int tmp=s[f[i]]+a[i];
ans[tmp]=i;
}
//rep(i,1,n) printf("%d %d\n",i,ans[i]+1 );
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&k,&q);
init();
while (q--){
int x;
scanf("%d",&x);
printf("%d\n",ans[x]+);
}
} return ;
}
HDU5860 (递推)的更多相关文章
- 【BZOJ-2476】战场的数目     矩阵乘法 + 递推
		2476: 战场的数目 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 58 Solved: 38[Submit][Status][Discuss] D ... 
- 从一道NOI练习题说递推和递归
		一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ... 
- Flags-Ural1225简单递推
		Time limit: 1.0 second Memory limit: 64 MB On the Day of the Flag of Russia a shop-owner decided to ... 
- 利用Cayley-Hamilton theorem 优化矩阵线性递推
		平时有关线性递推的题,很多都可以利用矩阵乘法来解决. 时间复杂度一般是O(K3logn)因此对矩阵的规模限制比较大. 下面介绍一种利用利用Cayley-Hamilton theorem加速矩阵乘法的方 ... 
- 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】
		还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ... 
- 简单递推 HDU-2108
		要成为一个ACMer,就是要不断学习,不断刷题...最近写了一些递推,发现递推规律还是挺明显的,最简单的斐波那契函数(爬楼梯问题),这个大家应该都会,看一点稍微进阶了一点的,不是简单的v[i] = v ... 
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
		1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ... 
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
		矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ... 
- openjudge1768 最大子矩阵[二维前缀和or递推|DP]
		总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的 ... 
- 02python算法-递推
		递推 1什么是递推?:根据已有节点的值,以及规律推出之后节点的值 2为什么要用递推:简单的解决有规矩事件 3怎么用?: 我们举个经典的例子: 如果1对兔子每月能生1对小兔子,而每对小兔在它出生后的第3 ... 
随机推荐
- hdu5878 I Count Two Three(二分+ 打表)
			题目链接:hdu5878 I Count Two Three 题意:给出一个整数n, 找出一个大于等于n的最小整数m, 使得m可以表示为2^a * 3^b * 5^c * 7^d. 题解:打表预处 ... 
- easyui datagrid 学习
			一.清空datagrid所有数据 //得到所有数据行 var item = $('#ylProductListDataGrid').datagrid('getRows'); if (item) { / ... 
- js为元素添加onclick事件
			$("div.manu a:last").on('click',function(){ if (page == totalPage) { return; } page = page ... 
- ES mlockall作用——preventing that memory from being paged to the swap area
			elasticsearch还有一个重要的参数bootstrap.mlockall,这个参数的目的是当你无法关闭系统的swap的时候,建议把这个参数设为true.防止在内存不够用的时候,elastics ... 
- 源码编译Chrome
			官网描述 http://www.chromium.org/developers/how-tos/build-instructions-windows 为啥还要写这篇博客 太久没在这里写博客 Chrom ... 
- HDU 4405 Aeroplane chess 概率DP 难度:0
			http://acm.hdu.edu.cn/showproblem.php?pid=4405 明显,有飞机的时候不需要考虑骰子,一定是乘飞机更优 设E[i]为分数为i时还需要走的步数期望,j为某个可能 ... 
- hdu 4606 Occupy Cities
			http://acm.hdu.edu.cn/showproblem.php?pid=4606 两点之间如果有线段相隔的话,他们的最短路就需要经过线段的端点 把所有线段的端点也加入点数组中,求任意两个点 ... 
- JavaScript 自定义事件
			//自定义事件 function Event() { var handles = []; //绑定事件 this.addHandle=function(fn) { handles.push(fn); ... 
- 青蛙跳台阶(Fibonacci数列)
			问题 一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级.求该青蛙跳上一个n 级的台阶总共有多少种跳法. 思路 当n=1时,只有一种跳法,及f(1)=1,当n=2时,有两种跳法,及f(2)=2,当n= ... 
- Hibernate中的一对多与多对一映射
			1.需求 一个部门有多个员工; [一对多] 多个员工,属于一个部门 [多对一] 2.实体Bean设计 Dept: public class Dept { private int ... 
