热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ACMICPC2018沈阳赛区现场赛K.LettheFlamesBegin(约瑟夫环问题)

题目链接:题意:有n个人围成一个圈,从1开始报到第k个人出环,问第m个出环的人是谁,n、m、k

题目链接:

题意&#xff1a;有 n 个人围成一个圈&#xff0c;从 1 开始报到第 k 个人出环&#xff0c;问第 m 个出环的人是谁&#xff0c;n、m、k <&#61; 1e18 且 min&#xff08;m&#xff0c;k&#xff09;<&#61; 2e6。

题解&#xff1a;容易得出O&#xff08;m&#xff09;的递推公式 f[n][m] &#61; &#xff08;f[n-1][m-1] &#43; k - 1&#xff09;% n &#43; 1&#xff0c;初始状态 f[n-m&#43;1][1]容易得出&#xff0c;当 m 小的时候用该公式计算。考虑 k 大 m 小的情况下&#xff0c;递推式的取膜很多情况下没有用到&#xff0c;可以用乘法代替加法加速递推的过程&#xff1a;

当前状态为f[a][b] &#61; c&#xff0c; 经过 x 次加法后的状态为 f[a&#43;x][b&#43;x] &#61; c &#43; k * x&#xff0c;假设经过 x 次加法之后需要取模&#xff0c;有

c &#43; k * x > a &#43; x   →   x > &#xff08;a - c&#xff09;/ &#xff08;k - 1&#xff09;   

得到该不等式后便可以计算出另一种情况了&#xff0c;还要注意 k &#61; 1 需要特判。

 

1 #include
2 using namespace std;
3 #define ll long long
4 #define ull unsigned long long
5 #define mst(a,b) memset((a),(b),sizeof(a))
6 #define mp(a,b) make_pair(a,b)
7 #define pi acos(-1)
8 #define pii pair
9 #define pb push_back
10 const int INF &#61; 0x3f3f3f3f;
11 const double eps &#61; 1e-6;
12 const int MAXN &#61; 2e6 &#43; 10;
13 const int MAXM &#61; 1e8 &#43; 10;
14 const ll mod &#61; 1e9 &#43; 7;
15
16 ll f[MAXN];
17
18 int main() {
19 #ifdef local
20 freopen("data.txt", "r", stdin);
21 // freopen("data.txt", "w", stdout);
22 #endif
23 int cas &#61; 1;
24 int t;
25 scanf("%d",&t);
26 while(t--) {
27 ll n,m,k;
28 scanf("%lld%lld%lld",&n,&m,&k);
29 printf("Case #%d: ",cas&#43;&#43;);
30 if(m <&#61; k) {
31 f[1] &#61; k % (n - m &#43; 1);
32 if(f[1] &#61;&#61; 0) f[1] &#61; n - m &#43; 1;
33 for(ll i &#61; 2; i <&#61; m; i&#43;&#43;)
34 f[i] &#61; (f[i - 1] &#43; k - 1) % (n - m &#43; i) &#43; 1;
35 printf("%lld\n",f[m]);
36 } else {
37 if(k &#61;&#61; 1) printf("%lld\n",m);
38 else {
39 ll a &#61; n - m &#43; 1, b &#61; 1;
40 ll c &#61; k % a, x &#61; 0;
41 if(c &#61;&#61; 0) c &#61; a;
42 while(b &#43; x <&#61; m) {
43 a &#43;&#61; x, b &#43;&#61; x, c &#43;&#61; k * x;
44 c %&#61; a;
45 if(c &#61;&#61; 0) c &#61; a;
46 x &#61; (a - c) / (k - 1) &#43; 1;
47 }
48 c &#43;&#61; (m - b) * k;
49 c %&#61; n;
50 if(c &#61;&#61; 0) c &#61; n;
51 printf("%lld\n",c);
52 }
53 }
54 }
55 return 0;
56 }

 


转载于:https://www.cnblogs.com/scaulok/p/9911819.html


推荐阅读
  • 本文主要介绍了gym102222KVertex Covers(高维前缀和,meet in the middle)相关的知识,包括题意、思路和解题代码。题目给定一张n点m边的图,点带点权,定义点覆盖的权值为点权之积,要求所有点覆盖的权值之和膜qn小于等于36。文章详细介绍了解题思路,通过将图分成两个点数接近的点集L和R,并分别枚举子集S和T,判断S和T能否覆盖所有内部的边。文章还提到了使用位运算加速判断覆盖和推导T'的方法。最后给出了解题的代码。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文讲述了CodeForces1016C题目的解法。文章首先介绍了一种错误的理解,然后给出了正确的解法。其中,当位于一个角上时,有两种选择,一种是先一直走一行再返回来走,另一种是走到这一列的另一行上然后再往右走一列。作者给出了两种解法,一种是直接计算,一种是动态规划。最后,取两种解法的最优解作为答案。文章附上了源代码。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 本文介绍了一种求解最小权匹配问题的方法,使用了拆点和KM算法。通过将机器拆成多个点,表示加工的顺序,然后使用KM算法求解最小权匹配,得到最优解。文章给出了具体的代码实现,并提供了一篇题解作为参考。 ... [详细]
  • 判断编码是否可立即解码的程序及电话号码一致性判断程序
    本文介绍了两个编程题目,一个是判断编码是否可立即解码的程序,另一个是判断电话号码一致性的程序。对于第一个题目,给出一组二进制编码,判断是否存在一个编码是另一个编码的前缀,如果不存在则称为可立即解码的编码。对于第二个题目,给出一些电话号码,判断是否存在一个号码是另一个号码的前缀,如果不存在则说明这些号码是一致的。两个题目的解法类似,都使用了树的数据结构来实现。 ... [详细]
  • 给出一群女孩的重量和颜值和她们的朋友关系现在有一个舞台ab是朋友bc是朋友ac就是朋友给出最大承重可以邀请这些女孩来玩对于每一个朋友团体全邀请or邀请一个or不邀请问能邀请的女孩的 ... [详细]
  • DescriptionclickmeSolution套路的状压期望DP题。。。考虑倒退期望:设fi,jrolepresentationstyleposi ... [详细]
  • JZOJ 1266. 玉米田
    1266.玉米田(cowfood.pasccpp)(FileIO):input:cowfood.inoutput:cowfood.outTimeLimits:1000msMemor ... [详细]
author-avatar
lin悟_462
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有