test 7 Problem A: [noip2016十连测第七场]约瑟夫游戏 (找规律+数论)
2016-11-16 16:57
309 查看
Problem A: [noip2016十连测第七场]约瑟夫游戏
Time Limit: 20 Sec Memory Limit: 233 MBSubmit: 20 Solved: 9
[Submit][Status][Web
Board]
Description
YJC很喜欢玩游戏,今天他决定和朋友们玩约瑟夫游戏。约瑟夫游戏的规则是这样的:n个人围成一圈,从1号开始依次报数,当报到m时,报1、2、...、m-1的人出局,下一个人接着从1开始报,保证(n-1)是(m-1)的倍数。最后剩
的一个人获胜。YJC很想赢得游戏,但他太笨了,他想让你帮他算出自己应该站在哪个位置上。
http://www.lydsy.com/JudgeOnline/upload/201610/test7.rar
Input
第一行包含两个整数n和m,表示人数与数出的人数。2≤m≤n<2^63-1 且(n-1)是(m-1)的倍数。
Output
输出一行,包含一个整数,表示站在几号位置上能获得胜利。
Sample Input
10 10
Sample Output
10
HINT
[Submit][Status]题解:这应该也算是约瑟夫问题的变形吧。。。
刚开始的时候只想到了模拟递推。
就是f
表示n个人的时候最后剩下人的编号。那么显然f[1]=1。我们是在减去(m-1)个人的情况下得到的f[n-m+1]那么如果要推算f
,首先在转换的时候编号都减少了m,再者如果人数过少那么肯定会出现循环,比如1,2,3,4,5,如果从3开始数,m=5的话,一次报号的人是3,4,5,1,2,这样最终剩下的是2。所以在累加m的过程中,一定会出现计算到的数超出当前总人数的情况,所以f
=f[n-m+1]%(n-m+1)+m。
但是这样只能过50分。然后就有一个打标发现的规律。
f[m^a+m-1]=m,其他的f
=f[n-m+1]+m,那么我们令n=m^a+(m-1)*k 其中(m^a<n<=m^a+1)保证k的系数不能为0。
f
=k*m=f[m^a+m-1]+(k-1)*m=k*m.
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define LL long long using namespace std; LL n,m; int main() { scanf("%I64d%I64d",&n,&m); LL x=1; for (int i=1;x<n/m;i++) x*=m; printf("%I64d\n",(n-x)/(m-1)*m); }
相关文章推荐
- 【bzoj 十连测】[noip2016十连测第七场]Problem A: 约瑟夫游戏(递推+打表)
- test 8 Problem A: [noip2016十连测第八场]神炎皇 (数论+gcd两个性质的证明)
- test 3 Problem A: [noip2016十连测第三场]平均数 (实数二分+排序+树状数组)
- test3 Problem C: [noip2016十连测第三场]序列 (主席树)
- [BZOJbegin][NOIP十连测第七场]约瑟夫游戏(递推|数学相关|递归)
- zzuli 1905 Problem A: 小火山的跳子游戏(规律)
- 找规律(约瑟夫的数论问题,uva 1363)
- HDU 1792 A New Change Problem(数学规律题,数论知识)
- test 8 Problem C: [noip2016十连测第八场]幻魔皇 (递推+乱搞)
- test 8 Problem B: [noip2016十连测第八场]降雷皇 (dp+线段树)
- Eddy's 洗牌问题(规律题+数论)
- 约瑟夫问题(Josephus Problem)
- 2017广东工业大学程序设计竞赛决赛--Problem B: 占点游戏
- 2017广东工业大学程序设计竞赛决赛 Problem B: 占点游戏(博弈)
- 2017广东工业大学程序设计竞赛决赛 Problem H: tmk买礼物(数论)
- Codeforces Round #419 (Div. 2) D - Karen and Test(规律 杨辉三角)
- 题解西电OJ (Problem 1006 - 转盘游戏)--动态规划
- Jesephus problem ( 小议约瑟夫家的问题 )
- 2013 - ECJTU 暑期训练赛第七场-problem-G
- hiho 1296 数论三·约瑟夫问题