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