转圈游戏

问题描述

  n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏。按照顺时针方向给 n 个位置编号,从0 到 n-1。最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,......,依此类 推。
  游戏规则如下:每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小
伙伴走到第 m+1 号位置,......,依此类推,第n − m号位置上的小伙伴走到第 0 号位置,第 n-m+1 号位置上的小伙伴走到第 1 号位置,......,第 n-1 号位置上的小伙伴顺时针走到第 m-1 号位置。
  现在,一共进行了 10k 轮,请问 x 号小伙伴最后走到了第几号位置。

输入格式

  输入共 1 行,包含 4 个整数 n、m、k、x,每两个整数之间用一个空格隔开。

输出格式

  输出共 1 行,包含 1 个整数,表示 10k 轮后 x 号小伙伴所在的位置编号。

样例输入

10 3 4 5

样例输出

5

数据规模和约定

  对于 30%的数据,0 < k < 7;
  对于 80%的数据,0 < k < 107;
  对于 100%的数据,1 < n <
1,000,000,0 < m < n,1 ≤ x ≤ n,0 < k < 109。

思路:

这道题的核心思路就是x递增m,当x>n,就对n取余。

因为10^k太大了,所以必须找到规律来代替10^k,于是把10^k这个数分成多个10000来计算。之后再找出x1圈后x会回到初始位置,这道题就结束了。

代码:

#include<iostream>
using namespace std;
int main()
{
long long n, m, k, x,y;
cin >> n >> m >> k >> x;
long long x1 = x;
long long x2 = x;
for (long long i = ;i < 1e9;++i)
{
x += m;
x %= n;
if (x == x1)
{
x1 = i+;
break;
}
}//x1圈后回到x位置
int j = ;
for (int i=;i < k / ;++i)
{
j *= ;
j %= x1;
}
for (int i=;i < k % ;++i)
{
j *= ;
j %= x1;
}
//剩余j圈
for (int i = ;i <j;++i)
{
x2 += m;
x2 %= n;
}
cout << x2;
return ;
}

最新文章

  1. UTF-8编码的空格(194 160)问题
  2. spring: 加载远程配置
  3. 软件工程(FZU2015)增补作业
  4. “K米” 软件产品评测
  5. mvc获取时间戳
  6. C语言实现单链表-04版
  7. Gym 100801E Easy Arithmetic (思维题)
  8. JQuery 的bind和unbind函数
  9. 老式浏览器兼容HTML5和CSS3的问题
  10. jquery中ajax向action传递对象参数,json ,spring注入对象
  11. Creader VIII VS. Creader VII+
  12. Ubuntu下LaTex中文环境安装与配置
  13. 简介vsftpd及搭建配置
  14. IIS部署网站时常见问题解决
  15. loadrunner出现中文乱码
  16. 整合SSH框架实现简单登录
  17. JMeter&#160;java.net.SocketException:Operationnotsupported:connect解决方案
  18. 纯css3实现的switch开关按钮
  19. EF 事务
  20. Object,equals,toString

热门文章

  1. phpMyAdmin历史漏洞复现
  2. BUUCTF-Web Comment
  3. 3.pandas的简单查询
  4. 华东师范大学p163页,用闭区间套定理证明数列的可惜收敛准则,被网友解决了。
  5. Android性能优化----卡顿优化
  6. Jenkins部署jmx脚本
  7. springboot整合邮件发送(163邮箱发送为例)
  8. matplotlib绘制子图
  9. Python三引号
  10. Python os.fchdir() 方法