• 转圈游戏


    原题链接:https://www.luogu.org/problem/show?pid=1965#sub

    这题怎么说呢。。想通了应该就比较简单了。。

    有这么一个感觉,如果题目给的输入数据特少而且输出只有一两个数,而且数据量还非常非常大,那这题保不准是要推公式了。

    这题也是这样。如果说x=0,那么进行一轮后0号位的小伙伴会走到m号位,进行两轮后小伙伴会走到2m%n号位,三轮将会是3m%n。。。以此类推,第十轮的时候便是10m%n,那10^k轮之后,可以想到,应该是位于(m * 10^k) % n处。但是x不一定等于0,所以在式子前面再加一个x就好。

    所以最终答案就是ans = (x + m*10^k) % n  ( * )

    有人会问,k有10的九次方那么大,乘方怎么可能会乘开呢?

    由模数的性质(a±b) % p = ((a % p) ± b) % p,可以把 ( * )式化为 ans = (x + m*10^k % n) % n,这样,里面的乘方就可以用快速幂做。

    最后输出ans即可。

    参考代码:

     1 #include <iostream>
     2 #include <algorithm>
     3 using namespace std;
     4 int n,m,k,x;
     5 int fast_pow(int a,int x,int p){
     6     int ans = 1;
     7     int sum = a % p;
     8     for (;x;x>>=1,sum = sum*sum%p)
     9         if (x&1)
    10             ans = ans*sum%p;
    11     return ans;
    12 }
    13 int main(){
    14     cin >> n >> m >> k >> x;
    15     int ans = ( x + m*fast_pow(10,k,n) % n ) % n;
    16     cout << ans % n << endl;
    17     return 0;
    18 }
  • 相关阅读:
    关于前端输入框的限制和有效值
    js,jquery转json的几种方法
    java,js,jstl,EL的简单交互
    mysql字段冲突报错
    js的一些压缩和优化性能
    一个不错的html素材网站
    redis之数据操作详解
    redis之持久化操作
    redis之django-redis
    redis知识总汇
  • 原文地址:https://www.cnblogs.com/OIerShawnZhou/p/7565837.html
Copyright © 2020-2023  润新知