华师一附中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 编辑
  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. }

复制代码

作者: diggersun    时间: 2014-11-1 17:20
没错,楼上的大牛做法简单明了,精髓在于类快速幂求啊 A^B%n
作者: YTC    时间: 2018-6-13 12:46
  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. }
复制代码





欢迎光临 华师一附中OI组 (http://hsyit.cn/) Powered by Discuz! X3.2