標籤:
【題目描述】
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】
輸入共 1 行,包含 4 個整數 n、m、k、x,每兩個整數之間用一個空格隔開。
【輸出描述 Output Description】
輸出共 1 行,包含 1 個整數,表示 10^k 輪後 x 號小夥伴所在的位置編號。
【範例輸入 Sample Input】
10 3 4 5
【範例輸出 Sample Output】
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。
【解題思路】
看到資料範圍,我不由得倒吸一口涼氣,手畫幾個圖,大概明白這個題應該用快速冪去寫,然後就是快速冪的模運算什麼的。
1 program roll; 2 var k,n,m,x,w:int64; 3 function kuaisu(k:Longint):int64;//標準格式 4 var ans,mid:longint; 5 begin 6 ans:=1; 7 mid:=10; 8 while k>0 do 9 begin10 if k mod 2<>0 then ans:=(ans*mid) mod n ;11 k:=k div 2;12 mid:=(mid*mid) mod n;13 end;14 exit(ans);15 end;16 begin17 read(n,m,k,x);18 w:=kuaisu(k);19 writeln((w*m+x) mod n);20 end.
CODEVS 3285 轉圈遊戲