华师一附中OI组
标题:
NOIP2013高中第一题转圈游戏
[打印本页]
作者:
admin
时间:
2014-10-12 16:49
标题:
NOIP2013高中第一题转圈游戏
【问题描述】 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 号小伙伴最后走到了第几号位置。
【输入】
输入文件名为 circle.in。
输入共 1 行,包含 4 个整数 n、 m、 k、 x,每两个整数之间用一个空格隔开。
【输出】
输出文件名为 circle.out。
输出共 1 行,包含 1 个整数,表示 10k 轮后 x 号小伙伴所在的位置编号。
【输入输出样例】
circle.in
10 3 4 5
circle.out
5
【数据说明】
对于 30%的数据, 0 <k < 7;
对于 80%的数据, 0 < k< 107;
对于 100%的数据, 1 <n < 1,000,000, 0 <m <n 1 ≤ x ≤ n, 0 < k< 109。
作者:
/wjr/
时间:
2014-10-13 15:47
有点。。。。是10^k..
作者:
Settwarl
时间:
2014-10-15 12:56
本帖最后由 Settwarl 于 2014-10-28 17:51 编辑
#include<iostream>
using namespace std;
int n,m,k,x;
int f(int k)
{
int base=10%n;
int ans=1;
while(k>0)
{
if(k%2==1)
ans=(ans*base)%n;
base=(base*base)%n;
k=k/2;
}
return (m%n*ans%n)%n;
}
int main()
{
cin>>n>>m>>k>>x;
cout<<(x+f(k))%n<<endl;
return 0;
}
复制代码
作者:
diggersun
时间:
2014-11-1 17:20
没错,楼上的大牛做法简单明了,精髓在于类快速幂求啊 A^B%n
作者:
YTC
时间:
2018-6-13 12:46
#include<iostream>
using namespace std;
long long k,m,n,x;
long long ans;
int main()
{
cin>>n>>m>>k>>x;
ans=1;//之前写掉了这句话,WA了一次
long long p=10;
while(k)
{
if(k%2==1) ans=(ans*p)%n;
k/=2;
p=(p*p)%n;
}
cout<<(ans*m+x)%n;
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2