2019.7.10 校内测试题 转圈游戏

 题目

  转圈游戏(circle.cpp,1s,512MB)

【问题描述】:

  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 号位置。
  现在,一共进行了 10k 轮,请问 x 号小伙伴最后走到了第几号位置。

【输入文件】:

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

【输出文件】:

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

【输入输出样例】:

  circle.in
    10 3 4 5
  circle.out
    5

【数据规模】:

  对于 30%的数据,0<k<7< span="">;
  对于 80%的数据,0<k<107< span="">;
  对于 100%的数据,1<n<1,000,000< span="">,0<m<n< span="">,1≤x<n< span="">,0<k<109< span="">。

 

 

考试得分:  100

 

 

主要算法 :  同余(快速幂)

 

 

应试策略:

  快速幂模板题,略

   代码

#include<stdio.h>
#include<stdlib.h>
#define LL long long 
#define FORa(i,s,e) for(LL i=s;i<=e;i++)
#define FORs(i,s,e) for(LL i=s;i>=e;i--)
#define gc pa==pb&&(pb=(pa=buf)+fread(buf,1,100000,stdin),stdin)?EOF:*pa++
#define File(name) freopen(name".in","r",stdin);freopen(name".out","w",stdout);

using namespace std;
static char buf[100000],*pa=buf,*pb=buf;
inline LL read();

LL n,m,k,x;
LL Quickpow(LL a,LL b,LL c)
{
    LL ret=1;
    while(b)
    {
        if(b%2) ret=ret*a%c;
        a=a*a%c,b/=2; 
    }
    return ret%c;
}
int main()
{
    File("circle");
    n=read(),m=read(),k=read(),x=read();
    printf("%lld",(x+m*Quickpow(10,k,n))%n);
    return 0;
}
inline LL read()
{
    register LL f(1),x(0);register char c(gc);
    while(c<'0'||c>'9') f=c=='-'?-1:1,c=gc;
    while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=gc;
    return f*x;
}

 

 

 

 

非完美算法:  

    照搬应试策略

 

 

正解:

    照搬应试策略

 

 

 

总结:

    快速幂随后会有详解,敬请等待

 

 

 

 

 

 

转载于:https://www.cnblogs.com/SeanOcean/p/11164621.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值