Josephus again HDU
来源:互联网 发布:北京赛车软件下载 编辑:程序博客网 时间:2024/06/08 17:26
In our Jesephus game, we start with n people numbered 1 to n around a circle, and we eliminated every k remaining person until only one survives. For example, here’s the starting configuration for n = 10, k = 2, The elimination order is 2, 4, 6, 8, 10, 3, 7, 1, 9. So 5 survives.The problem: determine the survivor’s number , J(n, k).
Input
There are multiple cases, end with EOF
each case have two integer, n, k. (1<= n <= 10^12, 1 <= k <= 1000)
Output
each case a line J(n, k)
Sample Input
10 2
10 3
Sample Output
5
4
问题显而易见,对于这种问题,我们是有递推公式的;
假设
有递推公式:
所以答案就是
但是这里的n非常大,线性递推是不可行的,所以我们得优化一下递推过程。
我们看一下递推是,如果
我们分:
讨论,如果是第一种只要正常递推即可,第二种,我们只要看他可以累加到多少个m。
设可以累加x个m,即满足
所以:
若此时
#include<iostream>#include<cstdio>using namespace std;int f[100000];long long solve(long long n,long long m){ long long i=2; long long num=0; for(;;) { if(i>n) break; if(num+m>=i) { num=(num+m)%i; i++; } else { long long x=(i-num-1)/(m-1); if((i-num-1)%(m-1)==0) x--; if(i+x-1>n) { return num+(n+1-i)*m+1; //这里得出答案和实际都差1,所以需要在加1 } else { num+=x*m; i+=x; } } } return num+1;}int main(){ long long n,m; while(scanf("%lld%lld",&n,&m)==2) { if(m==1) printf("%lld\n",n); else printf("%lld\n",solve(n,m)); } return 0;}
- Josephus again HDU
- Josephus again HDOJ3089
- HDU3089 Josephus again【约瑟夫】【优化】
- hdu3089 Josephus again(快速约瑟夫环)
- Fibonacci again and again HDU
- josephus
- Josephus
- Josephus
- HDU 1021 Fibonacci Again
- HDU 1021 Fibonacci Again
- hdu 3376 Matrix again
- HDU 1021 Fibonacci Again
- HDU 2674 N! Again
- HDU 2674 N! Again
- hdu 1021 Fibonacci Again
- hdu--1787---gcd again
- HDU 2523 SORT AGAIN
- hdu 1021 Fibonacci Again
- 数据结构 顺序表
- Type C转console安卓手机配置线
- Sturts2提交表单到数据库后乱码
- 数组旋转
- 中缀表达式转化为后缀表达式,并计算结果
- Josephus again HDU
- 基于CAN总线的实验室管理系统
- 657. Judge Route Circle
- 51nod 1021 石子归并
- 对现有Hive的大表进行动态分区
- SXOJ843 迷失的奶牛
- 21分钟Mysql入门教程
- Centos 安装mysql问题解决
- getComputedStyle