【Noip2013】轉圈遊戲
描述:
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 號小夥伴最後走到了第幾號位置。
輸入:
輸入共 1 行,包含 4 個整數 n、m、k、x,每兩個整數之間用一個空格隔開。
輸出:
輸出共 1 行,包含 1 個整數,表示 10^k 輪後 x 號小夥伴所在的位置編號。
題解:
先求轉多少圈會回到原來的位置,設爲pla,然後快速冪10^k%pla求出實際轉的圈數,最後模擬一下答案就出來了。
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,k,x;
int pla;
long long pow(long long a,int b){
int t,y;
t=1;
y=a;
while(b!=0){
if(b&1==1) t=t*y%pla;
y=y*y%pla;
b=b>>1;
}
return t;
}
int main(){
scanf("%d%d%d%d",&n,&m,&k,&x);
pla=m%n;
for(int i=1;;i++){
if(pla==0){
pla=i;
break;
}
pla+=m;
pla%=n;
}
long long an=pow(10,k);
pla=x;
for(int i=1;i<=an;i++){
pla+=m;
pla%=n;
}
printf("%d",pla);
return 0;
}