华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2619|回复: 9
打印 上一主题 下一主题

NOIP2013高中第一题转圈游戏

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2014-10-12 16:49:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
【问题描述】 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。

回复

使用道具 举报

2

主题

17

帖子

143

积分

注册会员

Rank: 2

积分
143
QQ
沙发
发表于 2014-10-13 15:47:44 | 只看该作者
有点。。。。是10^k..
回复 支持 反对

使用道具 举报

3

主题

9

帖子

87

积分

注册会员

Rank: 2

积分
87
板凳
发表于 2014-10-15 12:56:03 | 只看该作者
本帖最后由 Settwarl 于 2014-10-28 17:51 编辑
  1. #include<iostream>
  2. using namespace std;
  3. int n,m,k,x;
  4. int f(int k)
  5. {
  6.     int base=10%n;
  7.     int ans=1;
  8.     while(k>0)
  9.     {
  10.         if(k%2==1)
  11.             ans=(ans*base)%n;
  12.         base=(base*base)%n;
  13.         k=k/2;
  14.     }
  15.     return (m%n*ans%n)%n;
  16. }
  17. int main()
  18. {
  19.     cin>>n>>m>>k>>x;
  20.     cout<<(x+f(k))%n<<endl;
  21.     return 0;
  22. }

复制代码
回复 支持 反对

使用道具 举报

61

主题

147

帖子

563

积分

超级版主

Rank: 8Rank: 8

积分
563
地板
发表于 2014-11-1 17:20:30 | 只看该作者
没错,楼上的大牛做法简单明了,精髓在于类快速幂求啊 A^B%n
回复 支持 反对

使用道具 举报

13

主题

41

帖子

211

积分

中级会员

Rank: 3Rank: 3

积分
211
5#
发表于 2018-6-13 12:46:05 | 只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. long long k,m,n,x;
  4. long long ans;
  5. int main()
  6. {
  7.     cin>>n>>m>>k>>x;
  8.     ans=1;//之前写掉了这句话,WA了一次
  9.     long long p=10;
  10.     while(k)
  11.     {
  12.         if(k%2==1) ans=(ans*p)%n;
  13.         k/=2;
  14.         p=(p*p)%n;
  15.     }
  16.     cout<<(ans*m+x)%n;
  17.     return 0;
  18. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 00:39 , Processed in 0.117631 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表