NOIP 2013 轉圈遊戲

【題目描述】ios

n個小夥伴(編號從 0 到 n−1)圍坐一圈玩遊戲。按照順時針方向給 n 個位置編號,從 0 到 n−1。最初,第 0 號小夥伴在第 0 號位置,第 1 號小夥伴在第 1 號位置,……,依此類推。git

遊戲規則以下:每一輪第 0 號位置上的小夥伴順時針走到第 m 號位置,第 1 號位置小夥伴走到第 m+1 號位置,……,依此類推,第 n−m 號位置上的小夥伴走到第 0 號位置,第 n−m+1 號位置上的小夥伴走到第 1 號位置,……,第 n−1 號位置上的小夥伴順時針走到第 m−1 號位置。spa

如今,一共進行了 10^k​​ 輪,請問 x 號小夥伴最後走到了第幾號位置。code

【輸入格式】blog

輸入共 1 行,包含 4 個整數 n、m、k、x,每兩個整數之間用一個空格隔開。遊戲

【輸出格式】get

輸出共 1 行,包含 1 個整數,表示 10^k 輪後 x 號小夥伴所在的位置編號。

string

很容易把式子列出來,it

x+M*10^k%nio

而後答案顯然了。

 

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#define MAXN 100010
#define in(a) a=read()
#define REP(i,k,n) for(int i=k;i<=n;i++)
using namespace std;
inline long long read(){
    long long x=0,f=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar())
        if(ch=='-')
            f=-1;
    for(;isdigit(ch);ch=getchar())
        x=x*10+ch-'0';
    return x*f;
}
long long n;
long long m,x,k;
long long ksm(long long a,long long b){
    long long ans=1;
    while(b){
        if(b%2==1)  ans=((ans%n)*(a%n))%n;
        a=(a*a)%n;
        b/=2;
    }
    return ans%n;    
}
int main(){
    in(n),in(m),in(k),in(x);
    cout<<(x+(m*ksm(10,k)%n))%n;
    return 0;
}
相關文章
相關標籤/搜索