转圈游戏

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 号位置。
现在,一共进行了 10^k轮,请问 x 号小伙伴最后走到了第几号位置。
输入格式
输入共 1 行,包含 4 个整数 n、m、k、x,每两个整数之间用一个空格隔开。
输出格式
输出共 1 行,包含 1 个整数,表示 10^k 轮后 x 号小伙伴所在的位置编号。
对于 30%的数据,0 < k < 7;
对于 80%的数据,0 < k < 10^7;
对于 100%的数据,1 <n < 1,000,000,0 < m < n,1 ≤ x ≤ n,0 < k < 10^9
样例输入
10 3 4 5
样例输出
5

******针对不同的题目,有两个细节需要注意
1)如果初始值a 大于 m ,那么需要在进入函数前就让a 对 m 取模,
2)若果m 为 1,可以直接在函数外部特判为 0,不需要进入函数来计算。(因为任何数对1 取模都是0。

快速幂的基本思路求a ^ b
1)当b是奇数时,那么有 a^b = a * a^*(b-1)
2)当b是偶数时,那么有 a^b = a^(b/2) * a^(b/2)
if(b % 2 == 1)可以改为if(b & 1)
1. 因为b & 1 是按位与,判断b的末尾是否为1 ,因此当b 为奇数时 b & 1 返回为1,if条件成立,这样执行速度更快
2. k=k>>1 就相当于 k = (k >> 1)也就是把k的2进制数整体往右移动一位,最左边用0补充,右移1位相当于除以 2。。

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
#define ll long long
int main()
{
 ll n,m,x,k;
 ll ans=1,t=10;
 cin>>n>>m>>k>>x;
 while(k)
 {
  if(k&1)//if(k%2==1)
  ans=(ans*t)%n;
  k=k>>1;//k=k/2;
  t=(t*t)%n;
 }
 cout<<(x+ans*m)%n<<endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值