蓝桥杯 转圈游戏 知识点:快速幂

76 阅读1分钟

504. 转圈游戏 - AcWing题库

视频解析:AcWing 504. 转圈游戏(每日一题)_哔哩哔哩_bilibili

题意解析

题目的意思是说有一个长度为n的环,环上的每个点a[i]每一轮都可以后移m位,一共有10k10^{k}轮,问给定一个环上点x,求x在经过10k10^{k}轮之后在哪个位置?

image.png

思想

x一轮可以走到m个位置,一共有10K10^{K}轮,那么就要走x+10kmx+10^{k}*m这么远。又因为题目给定的是一个环,走完n之后就又走到0了,因此我们还需要对n取模。那么我们最终可以用(x+10km)(x+10^{k}*m)%n来表示x经过10k10^{k}轮之后在哪个位置。

因为kk1e91e9,非常大,如果用循环来求10k10^{k}的话复杂度就已经超时了。因此我们可以用快速幂来降复杂度。 image.png

code

#include<bits/stdc++.h>
using namespace std;
int x,k,m,n;

int qmi(int a,int b,int p)
{
	int res=1;
	
	while(b)                  //指数为0就退出循环 
	{
		if(b&1)res=res*a%p;   //指数对应位是1就计进结果里 
	
	    b>>=1;                //指数右移
		a=a*a%p;              //底数倍增 
	}
	return res; 
}
int  main()
{
	cin>>n>>m>>k>>x;
	
    cout<<(x+qmi(10,k,n)*m)%n; 
}

image.png