描述

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 号小伙伴最后走到了第几号位置。

格式

输入格式

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

输出格式

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

样例1

样例输入1[复制]

10 3 4 5

样例输出1[复制]

5

解题报告

       一拿到这道题,首先想到找规律,是一个循环,于是就想到先求出这个循环的位置序列,然后用10^k mod 一次循环的次数便是答案。但是只过了九组数据。

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,x,ci;
long k;
int wz[1000005];
int main()
{
    freopen("circle.in","r",stdin);
    freopen("circle.out","w",stdout);
    cin>>n>>m>>k>>x;
    wz[0]=x;
    int b=x,t=0;
    do
    {
        t++;
        b=b+m;
        if (b>=n)
          b=b%n;
        wz[t]=b;
    }while(b!=x);
    int v=1;
    for(long i=1;i<=k;i++)
        {
            if (v==0) v=1;
            v=(v*10)%t;
        }    
    if (v==0) cout<<wz[0];
    else cout<<wz[v];
    return 0;
}

后来,知道要用 快速幂 就全过了。。

复习一下

#include<iostream>
#include<cstdio>
using namespace std;
long long n,m,x;
long long k;
int main()
{
    freopen("circle.in","r",stdin);
    freopen("circle.out","w",stdout);
    cin>>n>>m>>k>>x;
    long long t=1,tmp=10;
    while(k>0)                //快速幂
    {
        if(k%2)t=(t*tmp)%n;   //是奇数 2^(i-1)*1
        k=k>>1;
        tmp=(tmp*tmp)%n;      //如 10^(2^2)=10^(2^1)*10^(2^1) 即tmp*tmp
    }
    x=(x+t*m)%n;
    cout<<x;
    return 0;
}

掌握快速幂后,以后的幂的计算就快的多了

 

 posted on 2016-07-11 21:26  qzgxlx  阅读(417)  评论(0编辑  收藏  举报