博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51nod 1073 约瑟夫环
阅读量:7115 次
发布时间:2019-06-28

本文共 1304 字,大约阅读时间需要 4 分钟。

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 
 收藏
 关注
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。
例如:N = 3,K = 2。2号先出列,然后是1号,最后剩下的是3号。
Input
2个数N和K,表示N个人,数到K出列。(2 <= N, K <= 10^6)
Output
最后剩下的人的编号
Input示例
3 2
Output示例
3 裸模板题直接套模板 答案记得+1
#include 
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define FIN freopen("input.txt","r",stdin);#define FOUT freopen("output.txt","w",stdout);#define INF 0x3f3f3f3f#define INFLL 0x3f3f3f3f3f3f3f#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef long long LL;typedef pair
PII;using namespace std;/*F[n] = (F[n - 1] + m) % n, F[1] = 0返回的下标从0 开始,复杂度大约为O(m)*/int Joseph(int n, int m) { if(n == 1) return 0; if(m == 1) return n - 1; LL pre = 0; int now = 2; while(now <= n) { if(pre + m >= now) { pre = (pre + m) % now; now++; } else { int a = now - 1 - pre, b = m - 1; int k = a / b + (a % b != 0); if(now + k > n + 1) k = n + 1 - now; pre = (pre + (LL)m * k) % (now + k - 1); now += k; } } return pre;}int main() { //FIN int n, k; while(~scanf("%d%d", &n, &k)) { printf("%d\n", Joseph(n, k) + 1); } return 0;}

  

转载于:https://www.cnblogs.com/Hyouka/p/7338744.html

你可能感兴趣的文章
交换机IOS失效的恢复详解
查看>>
awk支持多个记录分隔符的写法
查看>>
OCI之Docker标准浅谈
查看>>
【15】Python100例基础练习(2)
查看>>
管理输入输出及vim命令
查看>>
cell single block physical read等待事件
查看>>
Linux正则表达式
查看>>
kvm安装centos报错error processing drive
查看>>
云计算引领市场准入速度
查看>>
开源的四股力量
查看>>
Redis集群安装
查看>>
在windows下如何通过命令设置IP地址
查看>>
nagios监控多台主机(nrpe)
查看>>
Centos6下nginx+keepalived构建高可用web集群
查看>>
Linux基础 文件的管理 正则表达式的应用的一些比较好的 练习
查看>>
九、LAMP的安装与配置
查看>>
wxWidgets第十五课 wxBitmap图片显示
查看>>
windows安装64位Pygame方法
查看>>
我在美国:当“洋教授”的甜酸苦辣(六)
查看>>
ScreenOS 原始IP访问MIP配置方法
查看>>