K - Let the Flames Begin

题意:

n个人围成一个环,编号分别是1~n,从第一个人开始报数,报道k的人被移除,然后下一个人从1重新报,一直这样进行。问第m给被移除的人报数是多少?
一共T组数据,所有组数据的min{m,k}的总和不会超过2e6

题解:

经典约瑟夫环,约瑟夫环的模板:

//从第一个开始报数,数到k的将被杀掉
int josepus(int n,int k)
{int r=0;for(int i=2;i<=n;i++) r=(r+k)%i;return r+1; //0~n-1 所以最后结果+1
}
//第m个被杀掉的人
int josepus(int n,int m,int k)
{r=(k-1)%(n-m+1);for(int i=2;i<=m;i++){r=(r+k)%(n-m+i);}return r+1;
}

min{m,k}的总和不会超过2e6
当m<k时,m的总和不会超过2e6,我们可以直接用约瑟夫环的模板,复杂度O(m)
当m>k时,直接用模板会超时,我们注意看公式(r+k)%(n-m+i);当k小时,此时k可能远小于n,因为n的范围可以达到1e18,那么ans可能加上好几轮k都无法取模,所有我们用乘法加速,直接求出ans+c*k>(n-m+i),求c的值,这样可以加速运算

代码:

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f3f3f3f3f
#define inf 0x3f3f3f3f
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define re register
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(a) ((a)&-(a))
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
#define fi first
#define rep(i,n) for(int i=0;(i)<(n);i++)
#define rep1(i,n) for(int i=1;(i)<=(n);i++)
#define se secondusing namespace std;
typedef long long  ll;
typedef unsigned long long  ull;
typedef pair<int,int > pii;
int dx[4]= {-1,1,0,0},dy[4]= {0,0,1,-1};
const ll mod=2520;
const ll N=2e5+10;int main(){iosint t;cin>>t;int cc=0;while(t--){ll n,m,k;cin>>n>>m>>k;ll ans=0;if(k==1) ans=m;else{if(m<k){ans=(k-1)%(n-m+1);for(int i=2;i<=m;i++){ans=(ans+k)%(n-m+i);}ans++;}else{ans=(k-1)%(n-m+1);ll now=1;ll t;while(now<m){/*ans+c*k>(n-m+i)c>((n-m+i)-ans)/k*/t=((n-m+now)-ans+k-2)/(k-1);//向上取整if(now+t>m){ans=(ans+(m-now)*k)%n;}else ans=(ans+t*k)%(n-m+(now+t));now+=t;}ans++;}}cout<<"Case #"<<++cc<<": "<<ans<<endl;}return 0;
}

K - Let the Flames Begin相关推荐

  1. K - Let the Flames Begin Gym - 101955K(约瑟夫环/2018icpc沈阳)

    VJ地址 思路:因为m和k的最小值一定小于2E6,那么我们可以分情况来求,如果m比较小直接o(m) 递推求出第m个死的人,如果k比较小,我们在每一轮+k的时候取模的操作都是无效的,我们可以用乘法累积起 ...

  2. ACM-ICPC 2018 沈阳赛区现场赛 K. Let the Flames Begin (约瑟夫环问题)

    题目链接: 题意:有 n 个人围成一个圈,从 1 开始报到第 k 个人出环,问第 m 个出环的人是谁,n.m.k <= 1e18 且 min(m,k)<= 2e6. 题解:容易得出O(m) ...

  3. Let the Flames Begin(约瑟夫环)

    题目描述 Tonight n young men are going to participate in Peter's campfire party. They decide to play an ...

  4. 2018沈阳k(经典的约瑟夫环)

    地址 K Let the Flames Begin 首先,对于经典的约瑟夫环问题,我们记f(n,m)f(n,m)f(n,m)表示初始有nnn个人,第mmm个出队的人是谁(从0号开始报数).则有递推式f ...

  5. 2018-2019 ACM-ICPC, Asia Shenyang Regional Contest题解

    以下所有AC题解代码来自"仙客传奇"团队. AC题数:4/13 CGJK A. Sockpuppets B. Sequences Generator C. Insertion So ...

  6. O(n)级选排名第k位数(附上算法复杂度分析)

    算法简述 如果想要拿到第k位,一般说复杂度都比较高.例如,用快排等方式,要用了O(nlogn)水平的时间复杂度.就算是用快排改进,每次在快排的基础上,只排剩下的一部分,在平均水平上,也会变成了O(nl ...

  7. 每天一道LeetCode-----将数组/链表后k个元素移动到前面

    Rotate Array 原题链接Rotate Array 回转一个给定数组k步,本质上是将后k个元素移动到前面(需要保证k小于数组元素个数) 不在原数组上操作的话比较简单,新开一个vector保存回 ...

  8. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)签到题K Co-prime Permutation,L Let‘s Play Curling

    序 emmm因为没时间补题(虽然签到有四题),所以只能先放两个签到. 这是比赛链接:https://ac.nowcoder.com/acm/contest/10272 这是题解链接:2020年ICPC ...

  9. 数据挖掘——决策树和K近邻

    决策树和K近邻 一.线性回归(房价预测) 第1关:线性回归算法思想 (一)相关知识 1>简单线性回归 2>多元线性回归 (二)编程要求 (三)参考答案 第2关:动手实现线性回归 (一)相关 ...

最新文章

  1. 人工智能十大流行算法
  2. 微信访问H5,闪退问题
  3. 矿Spring入门Demo
  4. 如何生成安全的密码 Hash:MD5, SHA, PBKDF2, BCrypt
  5. python生成的exe程序在其他电脑打开报错_9102年你还不会搭建Python环境
  6. python笔试题(1)
  7. 【详细解析】基础实验4-2.6 目录树 (30 分)
  8. servlet 开发入门生命周期
  9. matlab无穷积分求解_matlab编程求无穷限定积分
  10. 神经网络拟合高程异常
  11. 递归函数定义、递归应用案例-科赫雪花/雪花晶片/汉诺塔
  12. log2 3怎样用计算机打出,红警在局域网怎么样才可以2个人打多个电脑玩家?要打3个电脑以上的...
  13. android适配器
  14. 计算机第三套演示文稿yswg.pptx,打开考生文件夹下的演示文稿yswg.pptx,根据考生文件夹下的文件“PPT-素材.docx”,按照下列要求完善 - 赏学吧...
  15. Python数据的输出
  16. 扯ruan蛋的房价,恶心死了我
  17. CGAL4.4_2D限定三角化及网格(2D Conforming Triangulations and Meshes)
  18. 孤单还是对你最好的惩罚
  19. spss进行多元线性回归并分析表格(转载)
  20. 程序员分界线:30岁,30岁转行、35岁转行、35岁被迫裁员

热门文章

  1. 厉害了!这几位小学生竟然在艺术界掀起一阵风暴,简直是灵魂画手无疑.........
  2. 怪咖发明家,乔布斯给了他四亿,他没要,转身靠发明救了10亿人。
  3. 春节特惠活动┃一张纸一幅图,竟然提高了10倍的学习和工作效率!?
  4. 看完这13张图,不得不佩服还是外国人会玩人工智能
  5. 我们只知大势将至,却不知未来已来
  6. 嵌入式linux配置qt,基于qt的嵌入式Linux开发环境搭建
  7. 平流式初沉池贮砂斗计算_城市污水处理厂产泥量的计算
  8. java得到文件创建时间linux,linux java获取文件创建时间
  9. 查询两个日期间隔天数怎么算_大厂都是怎么用Java8代替SimpleDateFormat?
  10. py2exe for python3_使用Py2Exe for Python3创建自己的exe程序