BSGS(Baby Steps,Giant Steps)

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
ll n,m,y,z,p,x,ans,block;
map<ll,int>mp;

ll quick(ll a,ll b,ll p)
{
    ll res=1%p;
    while (b)
    {
        if (b&1)
        {
            res=res*a%p;
        }
        a=a*a%p;
        b=b>>1;
    }
    return res;
}

void solve1()
{
    for (int i=1; i<=n; i++)
    {
        scanf("%lld%lld%lld",&y,&z,&p);
        y=y%p;
        printf("%lld\n",quick(y,z,p));
    }
}

void solve2()
{
    for (int i=1; i<=n; i++)
    {
        scanf("%lld%lld%lld",&y,&z,&p);
        y%=p;
        z%=p;
        if (y==0&&z!=0)
        {
            printf("Orz, I cannot find x!\n");
        }
        else
        {
            printf("%lld\n",z*quick(y,p-2,p)%p);
        }
    }
}

void solve3()
{

    for (int i=1; i<=n; i++)
    {
        scanf("%lld%lld%lld",&y,&z,&p);
        ans=-1;
        mp.clear();
        y=y%p;
        if (y==0&&z==0)
        {
            printf("1\n");
            continue;
        }
        if (y==0)
        {
            printf("Orz, I cannot find x!\n");
            continue;
        }
        block=ceil(sqrt(p));
        ll num=z;
        for (int j=0; j<=block; j++)
        {
            mp[num]=j+1;
            num=num*y%p;
        }
        ll sum=quick(y,block,p);
        num=sum;
        for (int j=1; j<=block; j++)
        {
            if (mp[num%p])
            {
                if (mp[num%p]==-1) ans=0;
                else
                {
                    ans=j*block-mp[num]+1;
                }
                break;
            }
            num=num*sum%p;
        }
        if (ans==-1)
        {
            printf("Orz, I cannot find x!\n");
        }
        else
        {
            printf("%lld\n",ans);
        }
    }
}

int main()
{
    scanf("%lld%lld",&n,&m);
    if (m==1)
    {
        solve1();
    }
    if (m==2)
    {
        solve2();
    }
    if (m==3)
    {
        solve3();
    }
}

  

原文地址:https://www.cnblogs.com/Accpted/p/11284874.html

时间: 2024-10-20 16:17:29

BSGS(Baby Steps,Giant Steps)的相关文章

BSGS算法_Baby steps giant steps算法(无扩展)最强详解,你从未见过的详细

Baby Steps-Varsity Giant Step-Astronauts(May'n?椎名慶治) 阅读时可以听听这两首歌,加深对这个算法的理解.(Baby steps少女时代翻唱过,这个原唱反而不是很有名……Giant Step就比较碉,是一个假面骑士片的插曲,由超碉的May'n和一个人建立的临时组合唱的,怕不怕) 这个主要是用来解决这个题: A^x=B(mod C)(C是质数),都是整数,已知A.B.C求x. 我在网上看了好多介绍,觉得他们写得都不够碉,我看不懂…于是我也来写一发. 先

bsgs(Baby Steps Giant Steps)算法

BSGS算法(Baby Steps Giant Steps算法,大步小步算法,北上广深算法,拔山盖世算法) 适用问题 对于式子: $$x^y=z(mod_p)$$ 已知x,z,p,p为质数: 求解一个最小非负整数y: 存在一个y,属于[0,p-2](费马小定理) 于是有了一个笨拙的方法,枚举y 枚举y,期望效率:O(P) 寻求一种优化: 对式子变型: 设:$$y=i\sqrt{p}-j$$ 则$$x^{i\sqrt{p}-j}=z(mod_p)$$ ——这个变型的用意在于把y拆开 枚举y,变成枚

数论之高次同余方程(Baby Step Giant Step + 拓展BSGS)

什么叫高次同余方程?说白了就是解决这样一个问题: A^x=B(mod C),求最小的x值. baby step giant step算法 题目条件:C是素数(事实上,A与C互质就可以.为什么?在BSGS算法中是要求a^m在%c条件下的逆元的,如果a.c不互质根本就没有逆元.) 如果x有解,那么0<=x<C,为什么? 我们可以回忆一下欧拉定理: 对于c是素数的情况,φ(c)=c-1 那么既然我们知道a^0=1,a^φ(c)=1(在%c的条件下).那么0~φ(c)必定是一个循环节(不一定是最小的)

BSGS_Baby steps giant steps算法

BSGS这个主要是用来解决这个题: A^x=B(mod C)(C是质数),都是整数,已知A.B.C求x. 在具体的题目中,C一般是所有可能事件的总数. 解: 设m = ceil(sqrt(C))(ceil为上取整), x = i * m + j, 那么A^x = (A^m)^i * A^j, (0 <= i < m, 0 <= j < m). 然后可以枚举i,O(sqrt(C))级别的枚举. 对于一个枚举出来的i,令D = (A^m)^i现在问题转化为求D * A^j ≡ B (m

BSGS算法 (小步大步 Baby Step Gaint Step)

当你要求满足: $$ A^x \equiv B \ (\bmod \ P) $$ 的最小非负整数 x (gcd(A,P)==1)就可以用到 BSGS 了 设 $ m=\sqrt{P} $ 向上取整 处理一下那个式子: $$ A^{i \times m-j} \equiv B \ (\bmod \ P) $$$$ A^{i \times m} \equiv B \times A^j \ (\bmod \ P) $$ 枚举 j(0到m),将 B*A^j 存入hash表里面枚举 i(1到m),从has

【poj3243】拓展BSGS(附hash版)

上一篇博文中说道了baby step giant step的方法(简称BSGS),不过对于XY mod Z = K ,若x和z并不互质,则不能直接套用BSGS的方法了. 为什么?因为这时候不存在逆元了啊,那么怎么办呢? 既然是x和z不互质,那么我们就想办法让他们互质,再套用BSGS的解法即可.(这就是所谓的消因子法)

QT学习 之 对话框 (四) 字体对话框、消息对话框、文件对话框、进程对话框(超详细中文注释)

QMessageBox类: 含有Question消息框.Information消息框.Warning消息框和Critical消息框等 通常有两种方式可以来创建标准消息对话框: 一种是采用“基于属性”的API,一种是使用QMessageBox的静态方法. 后者书写容易,但缺少灵活性,针对用户给出的提示的信息不够丰富,并且不能自定义消息对话框里面的按钮提示信息.因此推荐第一种写法. [cpp] view plaincopy <span style="font-size:18px;"&

(译)Minimal Shader(最小的着色器)

(原文:https://en.wikibooks.org/wiki/Cg_Programming/Unity/Minimal_Shader) This tutorial covers the basic steps to create a minimal Cg shader in Unity. 本节课包含了在Unity中创建一个最小的Cg着色器的基本步骤. Starting Unity and Creating a New Project(打开Unity创建一个新工程) After downlo

SQL Server调优系列进阶篇(深入剖析统计信息)

前言 经过前几篇的分析,其实大体已经初窥到SQL Server统计信息的重要性了,所以本篇就要祭出这个神器了. 该篇内容会很长,坐好板凳,瓜子零食之类... 不废话,进正题 技术准备 数据库版本为SQL Server2008R2,利用微软的以前的案例库(Northwind)进行分析,部分内容也会应用微软的另一个案例库AdventureWorks 相信了解SQL Server的朋友,对这两个库都不会太陌生. 概念理解 关于SQL Server中的统计信息,在联机丛书中是这样解释的 查询优化的统计信