COGS 1437.转圈游戏 解题报告
-----------------------------------------------------------------------------------------------------------
Janis
1437. [NOIP2013]转圈游戏
★ 输入文件:CircleNOIP2013.in
输出文件:
CircleNOIP2013.out
简单对比
时间限制:1 s 内存限制:128 MB
【题目描述】
【输入格式】
输入文件名改为:CircleNOIP2013.in
【输出格式】
输出文件名改为:CircleNOIP2013.out
【来源】
CCF全国信息学奥林匹克联赛 (NOIP2013)复赛Day1
(水题,强行凑字数 233333333333333)
分析:
看到这题第一眼,首先应该想到是小学奥数题,有关取余数之类的知识。然后再看题目要求及数据范围(好大),得知是快速幂取模,然后就很简单了。
算法设计:
一次走m个人第x位应该是轮数*m%n+x。
快速幂是利用分治策略。
a*b%c=((a%c)*(b%c))%c
#include<cstdio><span style="white-space:pre"> </span>//From Janis
#include<iostream>
using namespace std;
typedef long long ll;
ll n,m,k,x;
ll pow_n(ll p,ll k){//quick_pow p^k
ll tmp=1;
while(k){
if(k&1)tmp=(tmp*p)%n;
p=((p%n)*(p%n))%n;
k>>=1;
}
return tmp%n;
}
int main()
{
freopen("CircleNOIP2013.in","r",stdin);
freopen("CircleNOIP2013.out","w",stdout);
cin>>n>>m>>k>>x;
ll tmp=pow_n(10,k);
tmp*=m;
tmp%=n;
ll ans=tmp+x;
ans%=n;
cout<<ans;
}