别转了,我晕辣 @_@
一道关于快速幂的好题。
关于快速幂: https://www.cnblogs.com/fusiwei/p/11599881.html (By Seaway-Fu)
题目描述
$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$ 号小伙伴最后走到了第几号位置。
输入格式
共一行,包含四个整数 $n, m, k, x$,每两个整数之间用一个空格隔开。
输出格式
一个整数,表示 ${10}^k$ 轮后 $x$ 号小伙伴所在的位置编号。
样例 #1
样例输入 #1
10 3 4 5
样例输出 #1
5
提示
对于 $30\%$ 的数据,$0 < k < 7$;
对于 $80\%$ 的数据,$0 < k < {10}^7$;
对于 $100\%$ 的数据,$1 < n < {10}^6$,$0 < m < n$,$1 \le x \le n$,$0 < k < {10}^9$。
代码
//P1965 [NOIP2013 提高组] 转圈游戏
//https://www.luogu.com.cn/problem/P1965
//https://www.luogu.com.cn/record/83702161 0
//https://www.luogu.com.cn/record/83704961 10
//https://www.luogu.com.cn/record/83707908 20
//https://www.luogu.com.cn/record/83708500 100
#include<iostream>
using namespace std;
int main(){
int n,m,k,x,tmp=1,temp=10;
cin>>n>>m>>k>>x;
//快速幂求轮数
//例:k=(10)_10=(110)_2, 10^k=10^10=10^8*10^2=10^(2^3)*10^(2^2).
while(k){
if(k&1){
tmp=tmp*temp%n; //不要
}
temp=temp*temp%n; //忘记
k>>=1;
} //轮数上求余
cout<<(x%n+m%n*tmp%n)%n<<endl;
return 0; //尽管我没明白为啥轮数也得求余
}
//弱是我的问题QAQ