zoukankan      html  css  js  c++  java
  • 模板 BSGS

    BSGS存在的目的是求A^xequiv  B  (mod C)中x的解,BSGS算法要求A与C互质,且C为质数。

    #pragma warning(disable:4996)
    
    #include<iostream>
    #include<algorithm>
    #include<bitset>
    #include<tuple>
    #include<unordered_map>
    #include<fstream>
    #include<iomanip>
    #include<string>
    #include<cmath>
    #include<cstring>
    #include<vector>
    #include<map>
    #include<set>
    #include<list>
    #include<queue>
    #include<stack>
    #include<sstream>
    #include<cstdio>
    #include<ctime>
    #include<cstdlib>
    #define pb push_back
    #define INF 0x3f3f3f3f
    #define inf 0x7FFFFFFF
    #define moD 1000000003
    #define pii pair<ll,ll>
    #define eps 1e-8
    #define equals(a,b) (fabs(a-b)<eps)
    #define bug puts("bug")
    #define re  register
    #define fi first
    #define se second
    typedef  long long ll;
    typedef unsigned long long ull;
    const ll MOD = 1e6 + 7;
    const int maxn = 1e6 +5;
    const double Inf = 10000.0;
    const double PI = acos(-1.0);
    using namespace std;
    
    #define mod 75643
    struct Hash{
        int ha;
        int id;
        int next;
    }a[mod];
    
    int head[mod];
    int top;
    
    void Insert(int x, int y){
        int k = x % mod;
        a[top].ha = x;
        a[top].id = y;
        a[top].next = head[k];
        head[k] = top++;
    }
    
    int Find(int x){
        int k = x % mod;
        for (int i = head[k]; i != -1; i = a[i].next)
            if (a[i].ha == x)
                return a[i].id;
        return -1;//表示没有找到
    }
    
    int BSGS(int a, int b, int c){
        if (b == 1)
            return 0;
        memset(head, -1, sizeof(head));
        top = 1;//一定要等于1
        int m = sqrt(c);
        ll p = 1, x = 1;
        for (int i = 0; i < m; ++i) {
            Insert(p * b % c, i);
            p = p * a % c;
        }
        for (ll i = m; ; i += m){
            x = x * p % c;//此时的p已经等于a^m
            int j = Find(x);
            if (j != -1)
                return i - j;//这里的i已经等于i*m了
            if (i > c)
                break;
        }
        return -1;
    }
    
    
    int main() {
        int a, b, c;
        while (~scanf("%d%d%d", &c, &a, &b)) {
            int ans = BSGS(a, b, c);
            if (ans == -1) puts("no solution");
            else printf("%d
    ", ans);
        }
    }
  • 相关阅读:
    学习笔记Jmail收发邮件
    ModalPopup
    学习笔记:UpdatePanel控件
    转AjaxControlToolkit的安装与使用详解
    转linq中的Single()、First()、Take(1) LINQ 标准的查询操作符 排序 orderby、thenby、Take
    转Global.asax文件
    转<%%>、<%=%>、<%$%>、<%@%>的区别
    C++文件包含处理—#include
    GISer学习之道(转载)
    OSG中的示例程序简介
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13394401.html
Copyright © 2011-2022 走看看