2022河南萌新联赛第(五)场:C.丢手绢(数论:快速幂)

https://ac.nowcoder.com/acm/contest/38718/C

题目描述 
N个小朋友正在玩一种类似丢手绢的游戏,但与丢手绢又有所区别。

小朋友们先围坐一圈,然后从0到N-1顺时针进行编号。开始游戏前小朋友的编号与所在位置的编号相同,即0号小朋友在0号位置,1号小朋友在1号位置,以此类推。随后小朋友们会进行10^k轮移动,每一轮所有小朋友都顺时针移动M个位置。

所以0号位置的小朋友到达M号位置,1号位置的小朋友到达M+1号位置,以此类推,N-M号位置的小朋友到达0号位置,N-M+1号位置的小朋友到达1号位置……N-1号位置的小朋友到达M-1号位置。
输入描述:
只有一行,包含4个整数n,m,k,x,整数间用空格隔开。

输出描述:
一个整数,表示10^k轮后x号小朋友所在的位置编号。
示例1
输入
10 3 4 5
输出
5

数论题要注意思维的转换

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL INF=1000000000;
const int N=200200,M=2002;
int a[N];
int qmi(int a,int b,int k)
{
    int res=1;
    while(b)
    {
        if(b&1) res=res*a%k;
        a=a*a%k;
        b>>=1;
    }
    return res;
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    //cin>>T;
    while(T--)
    {
        int n,m,k,x;
        cin>>n>>m>>k>>x;
        int t=qmi(10,k,n);//总共玩10的k次方轮游戏,每一轮最大的回转次数是n
        //所以这里求出的快速幂的意义就是指在除开转回去的那些无用功时,准确卡点到我们需要的移动步数
        cout<<(t*m+x)%n<<endl;//每一轮都顺时针移动m步数,总共是t轮,所以直接相乘
    }
    return 0;
}
posted @ 2022-08-12 11:01  Vijurria  阅读(48)  评论(0编辑  收藏  举报