zoukankan      html  css  js  c++  java
  • 模板 求二次剩余

    ll w;
    struct num {
        ll x, y;
    };
    
    num mul(num a, num b, ll p)
    {
        num ans = { 0,0 };
        ans.x = ((a.x * b.x % p + a.y * b.y % p * w % p) % p + p) % p;
        ans.y = ((a.x * b.y % p + a.y * b.x % p) % p + p) % p;
        return ans;
    }
    
    ll powwR(ll a, ll b, ll p) {
        ll ans = 1;
        while (b) {
            if (b & 1)ans = 1ll * ans % p * a % p;
            a = a % p * a % p;
            b >>= 1;
        }
        return ans % p;
    }
    ll powwi(num a, ll b, ll p) {
        num ans = { 1,0 };
        while (b) {
            if (b & 1)ans = mul(ans, a, p);
            a = mul(a, a, p);
            b >>= 1;
        }
        return ans.x % p;
    }
    
    ll solve(ll n, ll p)
    {
        n %= p;
        if (p == 2)return n;
        if (powwR(n, (p - 1) / 2, p) == p - 1)return -1;//不存在
        ll a;
        while (1)
        {
            a = rand() % p;
            w = ((a * a % p - n) % p + p) % p;
            if (powwR(w, (p - 1) / 2, p) == p - 1)break;
        }
        num x = { a,1 };
        return powwi(x, (p + 1) / 2, p);
    }

    -1 表示无解,否则两个相同解或者一个解。

  • 相关阅读:
    AC自动机
    哈希与哈希表
    Trie字典树
    整除
    P3375 【模板】KMP字符串匹配
    KMP算法
    Luogu-P1004 方格取数
    Luogu-P2758 编辑距离
    Luogu-P1018 乘积最大
    Luogu-P1880 [NOI1995]石子合并
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13469963.html
Copyright © 2011-2022 走看看