3285 轉圈遊戲

 題目描述 Description

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 號小夥伴最後走到了第幾號位置。

輸入描述 Input Description                    輸出描述 Output Description

輸入共 1 行,包含 4 個整數 n、m、k、x,每兩個整數之間用一個空格隔開。                           輸出共 1 行,包含 1 個整數,表示 10^k 輪後 x 號小夥伴所在的位置編號。

樣例輸入 Sample Input                        樣例輸出 Sample Output

10 3 4 5                                                         5

數據範圍及提示 Data Size & Hint

對於 30%的數據,0 < k < 7; 
對於 80%的數據,0 < k < 10^7; 
對於 100%的數據,1 < n < 1,000,000,0 < m < n,1 <= x <=n,0 < k < 10^9。

分類標籤 Tags
數論   快速冪   noip2013    提高組

代碼 

#include<iostream>
using namespace std;
int mod(int k,int n)
{
  if(k==0)return 1;
  int b = mod(k/2,n);
  long long ans = b*b%n;
  if(k%2==1)ans=ans*10%n;
  return (int)ans;
}
int main()
{
  int n,m,k,x;    //n個人,每輪走m步,走10^k輪,求x的位置
  cin>>n>>m>>k>>x;
  int a = mod(k,n);   //求10^k%n的值
  while(a--)x = (x+m)%n;  //把剩餘的走了
  cout<<x<<endl;
  return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章