zoukankan      html  css  js  c++  java
  • 算法笔记--BSGS && exBSGS 模板

    https://www.cnblogs.com/sdzwyq/p/9900650.html
    模板:

    unordered_map<int, int> mp;
    LL q_pow(LL n, LL k, LL p) {
        LL ans = 1;
        if(k == -1) return 0;
        while(k) {
            if(k&1) ans = (ans*n) % p;
            n = (n*n) % p;
            k >>= 1;
        }
        return ans;
    }
    int BSGS(int a, int b, int p){
        int m = sqrt(p)+1, s = b;
        mp.clear();
        for(int i = 0; i < m; ++i){
            mp[s]=i;
            s= (s*1LL*a)%p;
        }
        int t = q_pow(a, m, p);
        s = 1;
        for(int i = 1; i <= m; ++i){
            s = (s*1LL*t)%p;
            if(mp.find(s) != mp.end()) return i*m-mp[s];
        }
        return -1;
    }
    int exBSGS(int a, int b, int p) {
        int d = __gcd(a, p), k = 1, t = 0;
        while(d^1){
            if(b%d) return -1;
            ++t;
            b /= d;
            p /= d;
            k = (k*1LL*(a/d)) % p;
            if(b == k) return t;
            d = __gcd(a, p);
        }
        int s = b;
        mp.clear();
        int m = sqrt(p) + 1;
        for(int i = 0;i < m; ++i){
            mp[s] = i;
            s = (s*1LL*a) % p;
        }
        s = k;
        k = q_pow(a, m, p);
        for(int i = 1; i <= m; ++i){
            s = (s*1LL*k) % p;
            if(mp.find(s) != mp.end()) return i*m-mp[s]+t;
        }
        return -1;
    }
    

    例题:P4195 【模板】exBSGS/Spoj3105 Mod
    代码:

    #pragma GCC optimize(2)
    #pragma GCC optimize(3)
    #pragma GCC optimize(4)
    #include<bits/stdc++.h>
    using namespace std;
    #define y1 y11
    #define fi first
    #define se second
    #define pi acos(-1.0)
    #define LL long long
    //#define mp make_pair
    #define pb push_back
    #define ls rt<<1, l, m
    #define rs rt<<1|1, m+1, r
    #define ULL unsigned LL
    #define pll pair<LL, LL>
    #define pli pair<LL, int>
    #define pii pair<int, int>
    #define piii pair<pii, int>
    #define pdd pair<double, double>
    #define mem(a, b) memset(a, b, sizeof(a))
    #define debug(x) cerr << #x << " = " << x << "
    ";
    #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    //head
    
    unordered_map<int, int> mp;
    LL q_pow(LL n, LL k, LL p) {
        LL ans = 1;
        if(k == -1) return 0;
        while(k) {
            if(k&1) ans = (ans*n) % p;
            n = (n*n) % p;
            k >>= 1;
        }
        return ans;
    }
    int exBSGS(int a, int b, int p) {
        int d = __gcd(a, p), k = 1, t = 0;
        while(d^1){
            if(b%d) return -1;
            ++t;
            b /= d;
            p /= d;
            k = (k*1LL*(a/d)) % p;
            if(b == k) return t;
            d = __gcd(a, p);
        }
        int s = b;
        mp.clear();
        int m = sqrt(p) + 1;
        for(int i = 0;i < m; ++i){
            mp[s] = i;
            s = (s*1LL*a) % p;
        }
        s = k;
        k = q_pow(a, m, p);
        for(int i = 1; i <= m; ++i){
            s = (s*1LL*k) % p;
            if(mp.find(s) != mp.end()) return i*m-mp[s]+t;
        }
        return -1;
    }
    int a, b, p;
    int main() {
        while(~scanf("%d %d %d", &a, &p, &b)) {
        	if(!a && !b && !p) break;
    		if(b == 1) {
    			if(p == 1) printf("No Solution
    ");
    			else printf("0
    ");
    		} 
    		else {
    			int x = exBSGS(a, b, p);
    			if(~x) printf("%d
    ", x);
    			else printf("No Solution
    ");
    		}
    	}
        return 0;
    }
    
  • 相关阅读:
    WebService帮助类改良版,支持多webservice
    .NET-list扩展方法Distinct去重
    C#创建泛型类T的实例的三种方法
    划水网站
    DataGridView增加右键取消操作
    Sql Server 快捷键
    SQL Server中使用convert进行日期转换
    ToolStrip 选中某一项打勾
    H5实现手写功能
    git使用
  • 原文地址:https://www.cnblogs.com/widsom/p/11269525.html
Copyright © 2011-2022 走看看