2019.7.10 校内测试题 转圈游戏

Posted seanocean

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

 

 

 

 

非完美算法:  

    照搬应试策略

 

 

正解:

    照搬应试策略

 

 

 

总结:

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

 

 

 

 

 

 

技术图片

以上是关于2019.7.10 校内测试题 转圈游戏的主要内容,如果未能解决你的问题,请参考以下文章

NOIP201305转圈游戏

NOIP2013/day1/1/转圈游戏

校内测试2020-7-13校内测试

校内服务器压力测试

校内测试总结

18清明校内测试T1