• 【POJ2417】Discrete Logging-BSGS算法


    测试地址:Discrete Logging
    题目大意:给定质数P和小于P的两个正整数B,N,求满足BLmodP=N的最小的非负整数L
    做法:本题需要用到BSGS算法。
    由费马小定理我们得知,最小的答案L一定满足0L<P,但是直接枚举是O(P)的,并不能承受。
    我们令L=i×m+j,那么在模P意义下,Bi×mN×Bj。那么我们只要先从小到大枚举j,把所有可能的右边的结果存到哈希表里(本题不能用map,会T),然后再从小到大枚举i,一旦Bi×m在哈希表里存在,那么我们就找到了最小的L
    分析上述算法,枚举iO(P/m)的,枚举jO(m)的,所以m太小或太大都会导致TLE,所以我们令m=P,这样两边枚举都是O(P)的,这样我们就巧妙地使用分块思想解决了这一问题,这就是BSGS算法。
    至于这个算法为什么叫Baby Step Giant Step…我个人觉得上述枚举j的过程,每次都跳B1,所以叫Baby Step,而上述枚举i的过程,每次都跳Bm,所以叫Giant Step,个人理解,不喜勿喷。
    没想到POJ居然不支持C++11…CE了3发,可能是我CE最多的一道题…(卒)
    以下是本人代码:

    #include <bits/stdc++.h>
    #define ll long long
    #define hashsiz 1000007
    using namespace std;
    ll p,b,n,mp[hashsiz+10],hash[hashsiz+10];
    
    ll power(ll a,ll b)
    {
        ll s=1,ss=a;
        while(b)
        {
            if (b&1) s=(s*ss)%p;
            ss=(ss*ss)%p,b>>=1;
        }
        return s;
    }
    
    ll hashinsert(ll x)
    {
        ll s=x%hashsiz;
        while (hash[s]) s++;
        hash[s]=x;
        return s;
    }
    
    ll hashfind(ll x)
    {
        ll s=x%hashsiz;
        while (hash[s]&&hash[s]!=x) s++;
        return s;
    }
    
    int main()
    {
        while(scanf("%lld%lld%lld",&p,&b,&n)!=EOF)
        {
            memset(mp,0,sizeof(mp));
            memset(hash,0,sizeof(hash));
            ll m=ceil(sqrt((double)p));
            ll x=1,B=power(b,p-2);
            for(ll i=0;i<m;i++)
            {
                ll pos=hashinsert((x*n)%p);
                mp[pos]=i+1;
                x=(x*B)%p;
            }
    
            x=1,B=power(b,m);
            bool flag=0;
            for(ll i=0;i<m;i++)
            {
                int pos=hashfind(x);
                if (mp[pos])
                {
                    printf("%lld
    ",i*m+mp[pos]-1);
                    flag=1;
                    break;
                }
                x=(x*B)%p;
            }
            if (!flag) printf("no solution
    ");
        }
    
        return 0;
    }
  • 相关阅读:
    API `requireNativePlugin` is not yet implemented
    undefined报错问题
    多线程的libcurl的使用
    RabbitMQ初识及简单实践
    献芹奏曝Python面试题算法数组篇
    饮冰三年人工智能Django淘宝拾遗75数据准备
    献芹奏曝Python面试题算法动态规划篇
    目录遍历学习
    单例模式在创建数据库连接中的运用
    Case When Then判断
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793527.html
Copyright © 2020-2023  润新知