[51nod1074]约瑟夫环V2
2024-08-26 13:03:02
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。
例如:N = 3,K = 2。2号先出列,然后是1号,最后剩下的是3号。
Input:
2个数N和K,表示N个人,数到K出列。\((2 <= N <= 10^{18}, 2 <= K <= 1000)\)
Output:
最后剩下的人的编号
my solution:暴力打表得出规律:\(f[n]=(f[n-1]+k)%n\)注意这个式子,因为k远远小于n所以,我们可以将式子转化为\((f[n+w]=f[n]+k*w)%(n+w)\),但是注意不能连续实际模两次,否则答案会有误
因此我们\(w=(i-ans)/k+1\),这样保证了<1>最多一次运算会有一次实际取模,<2>保障每次n至少加1,不会死循环
实际上操作我们将ans初始化为0,最后的答案加1,因为只有在区间\((1,n)\)中\(f[i]=(f[i-1]+k)%i\)才成立
复杂度\(O(klogn)\)不会分析
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
long long n,k;
int main(){
cin>>n>>k;
long long ans=0;
for(long long i=1;i<=n;){
long long w=(i-ans)/k+1;
if(w+i>n)w=n-i;
if(w==0)break;
ans=(ans+w*k)%(w+i);
i+=w;
}
cout<<ans+1;
return 0;
}
//code from 本机房巨佬
最新文章
- Servlet入门笔记
- 【406错误】 The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request ";accept"; headers.
- NOIP提高组2010 关押罪犯
- linux进入软连接所指向的原目录
- JPEG文件格式介绍
- solr与.net系列课程(九)solr5.1的配置
- paip.提高效率---微信 手机app快速开发平台—微网络撬动大市场
- bzoj 1012 维护一个单调数列
- 黄聪:wordpress工作原理
- maven的update project是什么意思
- android activity空指针异常解决问题解决
- 从问题看本质: 研究TCP close_wait的内幕
- ELF二进制目标文件详解
- Jersey中的常用注解总结
- (3)markdown软件的使用
- 高级组件——分割面板JSplitPane
- 潭州课堂25班:Ph201805201 django框架 第二课 url,,include,kwargs,name的使用 (课堂笔记)
- python 读取xml
- jmeter☞工作区介绍(三)
- mysql中如何比较日期