• Codeforces Round #460 (Div. 2) E. Congruence Equation (CRT+数论)


    题目链接:

    http://codeforces.com/problemset/problem/919/E

    题意:

    让你求满足 (na^nequiv b pmod p)(n) 的个数。

    (2 ≤ p ≤ 10^{6} + 3, 1 ≤ a, b < p, 1 ≤ x ≤ 10^{12}).

    题解:

    因为:

    $n mod p $的循环节是 (p)

    (a^{n} mod p)的循环节是 (p-1)。(费马小定理)

    所以: (na^n mod p​)的循环节为 (p*(p-1))

    因为 (p)是质数。

    假设: (n mod p equiv i, a^nmod pequiv a^j).

    (a^n mod p equiv i) ----①

    $a^nmod pequiv a^j $ ----②

    (na^nequiv b pmod p) ----③

    可以得到: (i imes a^j equiv b pmod p).

    我们现在枚举的(a^n) 中的 (n)(j) , 满足 (n imes a^n mod p = b)(n)(i).

    列出同余方程:

    $i equiv b*a^{-j} pmod p $ ---①

    (iequiv j pmod {p-1}) ---②

    利用 (CRT) 可以解出 :(i=(p-1)^2ba^{-j}+pj) ,其中 (a^{-j}) 是$ a^{j}$ 在 $mod p $意义下的逆元。

    因为在所有 (<=x)(i) 的倍数都满足条件,除法统计一下即可。

    复杂度:(O(p*logp))

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    ll qpower(ll a,ll b, ll mod)
    {
      ll ans = 1;
      while(b){
        if(b&1) ans = ans * a % mod;
        b>>=1;
        a=a*a%mod;
      }
      return ans;
    }
    ll a,b,mod,x;
    int main(int argc, char const *argv[]) {
      std::cin >> a >> b >> mod >> x;
      ll ans = 0;
      for(int i = 1;i <= mod-1;i++) {
        ll  c = qpower( qpower(a, i , mod) , mod - 2, mod) * b % mod;
        ll  n = ((mod-1) * (mod-1) * c + mod * i) % (mod * (mod-1));
        ans += ( x / (mod * (mod-1)) ) + (x % (mod * (mod-1)) >= n );
      }
      std::cout << ans << '
    ';
      return 0;
    }
    
    
  • 相关阅读:
    通过anaconda进行python多版本控制
    搭建java环境
    windows安装 Microsoft Visual c++
    更改jupyter notebook的主题颜色(theme) 包括pycharm
    linux服务器安装anaconda,然后远程使用jupyter
    根据经纬度坐标计算距离-python
    Redis相关链接
    VBA笔记-参考教程
    用sklearn计算卡方检验P值
    linux创建新用户
  • 原文地址:https://www.cnblogs.com/LzyRapx/p/8405402.html
Copyright © 2020-2023  润新知