SDNU 1300.转圈游戏(快速幂)

Description

 n个MM(编号从0到n-1)围在一圈“丢手绢”。按照顺时针方向给n个位置编号,从0到n-1。最初,第0号MM在第0号位置,第1号MM在第1号位置,……,依此类推。 

游戏规则如下:每一轮第0号位置上的MM顺时针走到第m号位置,第1号位置MM走到第m+1号位置,……,依此类推,第n−m号位置上的MM走到第0号位置,第n-m+1号位置上的MM走到第1号位置,……,第n-1号位置上的MM顺时针走到第m-1号位置。  现在,一共进行了10^k轮,请问x号MM最后走到了第几号位置。  

Input

输入共1行,包含4个整数n、m、k、x,每两个整数之间用一个空格隔开。 

Output

输出共1行,包含1个整数,表示10^k轮后x号MM所在的位置编号。  

Sample Input

10 3 4 5

Sample Output

5

Hint

对于30%的数据,0<𝑘<7; 对于80%的数据,0<𝑘<10^7; 

对于100%的数据,1<𝑛<1,000,000,0<𝑚<𝑛,0≤x <n< span="">,0<𝑘<10^9。 

#include <cstdio>
#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#include <map>
using namespace std;

#define ll long long
#define eps 1e-9

const int inf = 0x3f3f3f3f;
const int mod = 1e9+7;

ll qsm(ll a, ll b, ll c)
{
    ll sum = 1;
    a = a % c;
    while(b)
    {
        if(b & 1)
            sum = (sum * a) % c;
        b /= 2;
        a = (a * a) % c;
    }
    return sum;
}

int main()
{
    ll n, m, k, x;
    scanf("%lld%lld%lld%lld", &n, &m, &k, &x);
    ll buffer = qsm(10, k, n);
    ll s = ((x % n) + ((m % n) * buffer) % n) % n;
    printf("%lld\n", s);
    return 0;
}

 

posted @ 2019-08-12 15:28  明霞  阅读(180)  评论(0编辑  收藏  举报