2018.12.18 bzoj2242: [SDOI2011]计算器(数论)

时间:2021-11-11 22:43:58

传送门

数论基础题。

对于第一种情况用快速幂,第二种用exgcdexgcdexgcd,第三种用bsgsbsgsbsgs


于是自己瞎yyyyyy了一个bsgsbsgsbsgs的板子(不知道是不是数据水了没卡如果有找出错的希望指正谢谢)

下面谈谈我对这个方法的理解。

实际上跟网上说的差不多。

要解ax≡bmod  pa^x\equiv b\mod pax≡bmodp

相当于令p=k∗A+B,0≤B&lt;pp=k*A+B,0\le B&lt;pp=k∗A+B,0≤B<p

然后假设x=k′∗A+B′,0≤B′&lt;px=k'*A+B',0\le B'&lt;px=k′∗A+B′,0≤B′<p

那么(aA)k′≡b∗(a−1)B′(a^A)^{k'}\equiv b*(a^-1)^{B'}(aA)k′≡b∗(a−1)B′

于是枚举k′k'k′和B′B'B′即可,可以想到在AAA取sqrtpsqrt_psqrtp​的时候最坏复杂度最优。

代码:

#include<bits/stdc++.h>
#include<tr1/unordered_map>
#define ri register int
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
typedef long long ll;
inline int ksm(int a,int p,int mod){int ret=1;for(;p;p>>=1,a=(ll)a*a%mod)if(p&1)ret=(ll)ret*a%mod;return ret;}
inline int gcd(int a,int b){while(b){int t=a;a=b,b=t%a;}return a;}
inline void exgcd(int a,int b,int&x,int&y){
	if(!b){x=1,y=0;return;}
	exgcd(b,a%b,x,y);
	int t=x;
	x=y,y=t-a/b*y;
}
inline int bsgs(int a,int b,int mod){
	a%=mod,b%=mod;
	if(!a&&!b)return 1;
	if(!a)return -1;
	tr1::unordered_map<int,int>S;
	int sqr=ceil(sqrt(mod-1)),inv=ksm(a,mod-2,mod);
	for(ri i=0,mul=b;i<sqr;++i,mul=(ll)mul*inv%mod)if(!S[mul])S[mul]=i?i:sqr;
	a=ksm(a,sqr,mod);
	for(ri i=0,mul=1;i*sqr<=mod;++i,mul=(ll)mul*a%mod)if(S[mul])return i*sqr+(S[mul])%sqr;
	return -1;
}
int main(){
	freopen("lx.in","r",stdin);
    for(ri a,b,p,tt=read(),k=read();tt;--tt){
        a=read(),b=read(),p=read();
        if(k==1){cout<<ksm(a%p,b,p)<<'\n';continue;}
        if(k==2){
            a%=p,b%=p;
            int g=gcd(a,p),x,y;
            if(b%g){puts("Orz, I cannot find x!");continue;}
            a/=g,b/=g,p/=g,exgcd(a,p,x,y),x=((ll)b*x%p+p)%p,cout<<x<<'\n';
            continue;
        }
        int tmp;
        if(~(tmp=bsgs(a,b,p)))cout<<tmp<<'\n';
        else puts("Orz, I cannot find x!");
    }
    return 0;
}

2018.12.18 bzoj2242: [SDOI2011]计算器(数论)的更多相关文章

  1. 【bzoj2242】&colon; &lbrack;SDOI2011&rsqb;计算器 数论-快速幂-扩展欧几里得-BSGS

    [bzoj2242]: [SDOI2011]计算器 1.快速幂 2.扩展欧几里得(费马小定理) 3.BSGS /* http://www.cnblogs.com/karl07/ */ #include ...

  2. &lbrack;bzoj2242&rsqb;&lbrack;Sdoi2011&rsqb;计算器&lowbar;exgcd&lowbar;BSGS

    计算器 bzoj-2242 Sdoi-2011 题目大意:裸题,支持快速幂.扩展gcd.拔山盖世 注释:所有数据保证int,10组数据. 想法:裸题,就是注意一下exgcd别敲错... ... 最后, ...

  3. BZOJ2242 &lbrack;SDOI2011&rsqb;计算器 【BSGS】

    2242: [SDOI2011]计算器 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 4741  Solved: 1796 [Submit][Sta ...

  4. 【数论】【快速幂】【扩展欧几里得】【BSGS算法】bzoj2242 &lbrack;SDOI2011&rsqb;计算器

    说是BSGS……但是跟前面那题的扩展BSGS其实是一样的……因为模数虽然是质数,但是其可能可以整除a!!所以这两者其实是一样的…… 第一二种操作不赘述. #include<cstdio> ...

  5. BZOJ2242&lbrack;SDOI2011&rsqb;计算器——exgcd&plus;BSGS

    题目描述 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给定y,z,p, ...

  6. 【数学 BSGS】bzoj2242&colon; &lbrack;SDOI2011&rsqb;计算器

    数论的板子集合…… Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最 ...

  7. BZOJ2242 &lbrack;SDOI2011&rsqb;计算器

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  8. bzoj2242&colon; &lbrack;SDOI2011&rsqb;计算器 BSGS&plus;exgcd

    你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值:(快速幂) 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数:(exgcd) 3.给 ...

  9. &lbrack;bzoj2242&rsqb;&lbrack;SDOI2011&rsqb;&lbrack;计算器&rsqb; &lpar;Baby-Step-Giant-Step&plus;快速幂&plus;exgcd&rpar;

    Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...

随机推荐

  1. thrift 服务端linux C &plus;&plus; 与客户端 windows python 环境配置(thrift 自带tutorial为例&rpar;

    关于Thrift文档化的确是做的不好.摸索了很久才终于把跨linux与windows跨C++与python语言的配置成功完成.以下是步骤: 1)                 Linux下环境配置 ...

  2. POJ2653判断直线是否相交

    bool judge(node p1,node p2,node p3,node p4){    if(min(p1.x,p2.x)>max(p3.x,p4.x)||min(p1.y,p2.y)& ...

  3. 做办公用品、文具方面的 B2C 是否有前景呢?

    企乐买现在正在做这方面的事,从市场角度来说需求是有的,客单价和重复购买率都还可以,但是也存在几个致命问题使得施展不开举步维艰: 1.中国特有的市场环境:在美国企业办公用品一般都是网上采购,避免灰色的东 ...

  4. &lbrack;项目机会&rsqb;citrix 虚拟桌面对于java等高CPU占用率如何解决

    citrix 虚拟桌面对于java等高CPU占用率如何解决 问题1:java等客户端对于虚拟桌面cpu影响较大,但是有些用户的确需要使用java支持的程序,是否可以通过其他途径来解决? 问题2:对于其 ...

  5. 让css初学者抓狂的属性float

    挣扎了好久,始终没有决定要不要写博客,心里有几个顾虑一是我是小白,我写的文章有没有人看?二是我是小白,我写的文章假如存在诸多错误,理解的不对发表上去再去误导别人.三是写一篇文章费时费力.但是我现在想明 ...

  6. iOS - Socket&Tab;&Tab;网络套接字

    1.Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个 Socket.Socket 又称 "套接字",应用程序通常通过 "套接字& ...

  7. 《Java程序设计》第6周学习总结

    学号20145220 <Java程序设计>第6周学习总结 教材学习内容总结 InputStream与OutputStream 10.1.1串流设计的概念 Java将输入/输出抽象化为串流, ...

  8. Repeater和Gridview前台显示行号的方法

    Repeater : Container.ItemIndex (行号从零开始,如果想改为从1开始,那么可以将以上的代码改为Container.ItemIndex + 1),见下示例: <asp: ...

  9. React-Native首次运行提示-ReferenceError-Can-t-find-variable-fbBatchedBridge

    React Native运行报错ReferenceError: Can't find variable: _fbBatchedBridge' React Native目前貌似要火的样子,作为移动开发人 ...

  10. 在 IIS MIME 类型中添加 md 扩展名

    最近在了解 Knowledge Base (知识库)的内容,对两个平台比较感兴趣,一个是 Raneto,一个是 MDwiki,两者都是使用md文件作为内容存储. 需要注意的是,使用IIS部署网站后,需 ...