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

别转了,我晕辣 @_@

一道关于快速幂的好题。

关于快速幂: 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
Just Programming With ♥️ & Peace
使用 Hugo 构建
主题 StackJimmy 设计