扩展BSGS的板子

对于gcd(a,p)>1的情况

即扩展BSGS

把式子变成等式的形式: \( a^x+yp=b \)

设 \( g=gcd(a,p) \)

那么两边同时除以g就会变成: \( \frac{a}{g} a^{x-1}+y\frac{p}{g}=\frac{b}{g} \)

如此循环到ap互质,然后正常BSGS求即可

最后答案加上循环次数,即当前的x是经过几次减一得到的

注意有很多关于0和1的特判

以及这道题在bzoj上是可以用map的,但是poj上只能用hash

map版:

#include<iostream>
#include<cstdio>
#include<map>
#include<cmath>
using namespace std;
int a,b,p,ans;
map<int,int>mp;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int ksm(int a,int b,int p)
{
int r=1;
while(b)
{
if(b&1)
r=(long long)r*a%p;
a=(long long)a*a%p;
b>>=1;
}
return r;
}
int BSGS(int a,int b,int p)
{
a%=p,b%=p;
if(b==1)
return 0;
int cnt=0,d=1;
for(int g=gcd(a,p);g!=1;g=gcd(a,p))
{
if(b%g)
return -1;
p/=g,b/=g;
d=(long long)d*a/g%p;
cnt++;
if(b==d)
return cnt;
}
mp.clear();
int m=ceil(sqrt(p)),t=b;
for(int i=0;i<m;i++)
{
mp[t]=i;
t=(long long)t*a%p;
}
int g=ksm(a,m,p);
t=(long long)d*g%p;
for(int i=1;i<=m+1;i++)
{
if(mp[t])
return cnt+i*m-mp[t];
t=(long long)t*g%p;
}
return -1;
}
int main()
{
while(scanf("%d%d%d",&a,&p,&b)&&a+b+p)
{
if(p==1)
{
puts("0");
continue;
}
ans=BSGS(a,b,p);
if(ans==-1)
puts("No Solution");
else
printf("%d\n",ans);
}
return 0;
}

hash版,大概比map快三到四倍

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int mod=739391,N=2e6;
int a,b,p,ans,ti,v[N],con;
struct qwe
{
int b,v,ne;
}ha[N];
void ins(int w,int b,int va)
{//cout<<va<<endl;
if(v[w]!=ti)
{
v[w]=ti;
ha[w].v=va;
ha[w].b=b;
ha[w].ne=-1;
return;
}
for(;ha[w].ne!=-1;w=ha[w].ne)
if(ha[w].b==b)
return;
ha[w].ne=++con;
ha[con].ne=-1;
ha[con].v=va;
ha[con].b=b;
}
int find(int w,int b)
{
if(v[w]!=ti)
return 0;
for(;w!=-1;w=ha[w].ne)
if(ha[w].b==b)
return ha[w].v;
return 0;
}
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int ksm(int a,int b,int p)
{
int r=1;
while(b)
{
if(b&1)
r=(long long)r*a%p;
a=(long long)a*a%p;
b>>=1;
}
return r;
}
int BSGS(int a,int b,int p)
{
a%=p,b%=p;
if(b==1)
return 0;
int cnt=0,d=1;
for(int g=gcd(a,p);g!=1;g=gcd(a,p))
{
if(b%g)
return -1;
p/=g,b/=g;
d=(long long)d*a/g%p;
cnt++;
if(b==d)
return cnt;
}
con=mod,ti++;
int m=ceil(sqrt(p)),t=b;
for(int i=0;i<m;i++)
{
ins(t%mod,t,i);
t=(long long)t*a%p;
}
int g=ksm(a,m,p),now;
t=(long long)d*g%p;
for(int i=1;i<=m+1;i++)
{
if(now=find(t%mod,t))
return cnt+i*m-now;
t=(long long)t*g%p;
}
return -1;
}
int main()
{
while(scanf("%d%d%d",&a,&p,&b)&&a+b+p)
{
if(p==1)
{
puts("0");
continue;
}
ans=BSGS(a,b,p);
if(ans==-1)
puts("No Solution");
else
printf("%d\n",ans);
}
return 0;
}

poj 3243 Clever Y && 1467: Pku3243 clever Y【扩展BSGS】的更多相关文章

  1. bzoj 1467: Pku3243 clever Y 扩展BSGS

    1467: Pku3243 clever Y Time Limit: 4 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description 小 ...

  2. bzoj1467 Pku3243 clever Y

    1467: Pku3243 clever Y Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 313  Solved: 181[Submit][Status ...

  3. 【EX_BSGS】BZOJ1467 Pku3243 clever Y

    1467: Pku3243 clever Y Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 425  Solved: 238[Submit][Status ...

  4. POJ 3243 Clever Y (求解高次同余方程A^x=B(mod C) Baby Step Giant Step算法)

    不理解Baby Step Giant Step算法,请戳: http://www.cnblogs.com/chenxiwenruo/p/3554885.html #include <iostre ...

  5. POJ 3243 Clever Y 扩展BSGS

    http://poj.org/problem?id=3243 这道题的输入数据输入后需要将a和b都%p https://blog.csdn.net/zzkksunboy/article/details ...

  6. 【POJ 3243】Clever Y 拓展BSGS

    调了一周,我真制杖,,, 各种初始化没有设为1,,,我当时到底在想什么??? 拓展BSGS,这是zky学长讲课的课件截屏: 是不是简单易懂.PS:聪哥说“拓展BSGS是偏题,省选不会考,信我没错”,那 ...

  7. POJ 3243 Clever Y(离散对数-拓展小步大步算法)

    Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, ...

  8. poj 3243 Clever Y 高次方程

    1 Accepted 8508K 579MS C++ 2237B/** hash的强大,,还是高次方程,不过要求n不一定是素数 **/ #include <iostream> #inclu ...

  9. [POJ 3243]Clever Y

    Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, ...

随机推荐

  1. 制作自己的网站第二步***在Linux上装上需要的软件以及部署项目配置**

    在购买自己的服务器后,如果想要把项目跑起来,就得安装一些必要的软件. 这里只说一些最基础最基本最不可或缺的几个.其他的可以根据自己的需要 安装使用. 首先,那就是配置jdk了,我们可以通过一些工具把下 ...

  2. 【.Net 学习系列】-- Windows身份模拟(WindowsIdentity.Impersonate)时读取Access数据库

    参考资料: WindowsIdentity.Impersonate https://msdn.microsoft.com/zh-cn/library/w070t6ka(v=vs.110).aspx A ...

  3. TDBXJSONStream(BERLIN新增)的使用

    DELPHI 10.1 BERLIN新增TDBXJSONStream类,用于方便地将数据序列为JSON,和将JSON还原出来数据. DATASNAP远程方法也相应地增加了支持返回TDBXJSONStr ...

  4. Office WORD如何为每一页设置不同的页眉页脚

    如下图所示,我想要为封面和目录,摘要等等设置不同的页眉页脚(一般封面和目录不需要页脚)   而从正文开始,套用相同的页眉和以页数作为页脚(注意"第一章 绪论"不是这个文档的第一页) ...

  5. 如何更有效的消灭watchdogs挖矿病毒?华为云DCS Redis为您支招

    漏洞概述 近日,互联网出现watchdogs挖矿病毒,攻击者可以利用Redis未授权访问漏洞入侵服务器,通过内外网扫描感染更多机器.被感染的主机出现 crontab 任务异常.系统文件被删除.CPU ...

  6. 关于MySQL的TPS和QPS

    TPS - Transactions Per Second(每秒传输的事物处理个数),这是指server每秒处理的事务数,支持事务的存储引擎如InnoDB等特有的一个性能指标. 计算方法: TPS = ...

  7. 2016/4/17 去除 ul ol 前标记 list-style:none list-style-type:none

    对于很多人用div来做网站时,总会用到,但在显示效果时前面总是会有一个小黑点,这个令很多人头痛,但又找不到要源,其它我们可以用以下方法来清除. 1.在CSS中写入代码.找到相关性的CSS,在..li和 ...

  8. Codeforces 440 D. Berland Federalization 树形DP,记录DP

    题目链接:http://codeforces.com/contest/440/problem/D D. Berland Federalization   Recently, Berland faces ...

  9. Hadoop0.20.203.0在关机重启后,namenode启动报错(/dfs/name is in an inconsistent state)

    Hadoop0.20.203.0在关机重启后,namenode启动报错: 2011-10-21 05:22:20,504 INFO org.apache.hadoop.hdfs.server.comm ...

  10. Swift学习笔记十四:构造(Initialization)

         类和结构体在实例创建时,必须为全部存储型属性设置合适的初始值. 存储型属性的值不能处于一个未知的状态.     你能够在构造器中为存储型属性赋初值,也能够在定义属性时为其设置默认值.下面章节 ...