洛谷笔记 - P1965 [NOIP2013 提高组] 转圈游戏

别转了,我晕辣 @_@

一道关于快速幂的好题。

关于快速幂: https://www.cnblogs.com/fusiwei/p/11599881.html (By Seaway-Fu)

题目描述

nn 个小伙伴(编号从 00n1n-1)围坐一圈玩游戏。按照顺时针方向给 nn 个位置编号,从 00n1n-1。最初,第 00 号小伙伴在第 00 号位置,第 11 号小伙伴在第 11 号位置,……,依此类推。游戏规则如下:每一轮第 00 号位置上的小伙伴顺时针走到第 mm 号位置,第 11 号位置小伙伴走到第 m+1m+1 号位置,……,依此类推,第 nmn - m 号位置上的小伙伴走到第 00 号位置,第 nm+1n - m+1 号位置上的小伙伴走到第 11 号位置,……,第 n1n-1 号位置上的小伙伴顺时针走到第 m1m-1 号位置。

现在,一共进行了 10k{10}^k 轮,请问 xx 号小伙伴最后走到了第几号位置。

输入格式

共一行,包含四个整数 n,m,k,xn, m, k, x,每两个整数之间用一个空格隔开。

输出格式

一个整数,表示 10k{10}^k 轮后 xx 号小伙伴所在的位置编号。

样例 #1

样例输入 #1

1
10 3 4 5

样例输出 #1

1
5

提示

对于 30%30\% 的数据,0<k<70 < k < 7

对于 80%80\% 的数据,0<k<1070 < k < {10}^7

对于 100%100\% 的数据,1<n<1061 < n < {10}^60<m<n0 < m < n1xn1 \le x \le n0<k<1090 < k < {10}^9

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//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