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; }
非完美算法:
照搬应试策略
正解:
照搬应试策略
总结:
快速幂随后会有详解,敬请等待