【題目描述】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; }