poj 3243 Clever Y && 1467: Pku3243 clever Y【扩展BSGS】
扩展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】的更多相关文章
- bzoj 1467: Pku3243 clever Y 扩展BSGS
1467: Pku3243 clever Y Time Limit: 4 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description 小 ...
- bzoj1467 Pku3243 clever Y
1467: Pku3243 clever Y Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 313 Solved: 181[Submit][Status ...
- 【EX_BSGS】BZOJ1467 Pku3243 clever Y
1467: Pku3243 clever Y Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 425 Solved: 238[Submit][Status ...
- 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 ...
- POJ 3243 Clever Y 扩展BSGS
http://poj.org/problem?id=3243 这道题的输入数据输入后需要将a和b都%p https://blog.csdn.net/zzkksunboy/article/details ...
- 【POJ 3243】Clever Y 拓展BSGS
调了一周,我真制杖,,, 各种初始化没有设为1,,,我当时到底在想什么??? 拓展BSGS,这是zky学长讲课的课件截屏: 是不是简单易懂.PS:聪哥说“拓展BSGS是偏题,省选不会考,信我没错”,那 ...
- POJ 3243 Clever Y(离散对数-拓展小步大步算法)
Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, ...
- poj 3243 Clever Y 高次方程
1 Accepted 8508K 579MS C++ 2237B/** hash的强大,,还是高次方程,不过要求n不一定是素数 **/ #include <iostream> #inclu ...
- [POJ 3243]Clever Y
Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, ...
随机推荐
- poj2553 有向图缩点,强连通分量。
//求这样的sink点:它能达到的点,那个点必能达到他,即(G)={v∈V|任意w∈V:(v→w)推出(w→v)} //我法:tarjan缩点后,遍历点,如果该点到达的点不在同一个强连通中,该点排除, ...
- Swift--方法(函数)
方法是执行特殊任务的自包含代码块.你可以给方法名字来表示它的功能,而且在需要的时候调用这个名字的方法来执行它的任务. Swift方法的语法表达很灵活,从类似c的没有参数名的方法到oc复杂的带有名字和参 ...
- mysql.bat
cls @echo off :设置窗口字体颜色 color 0a :设置窗口标题 TITLE MySQL管理程序 call :checkAdmin goto menu :菜单 :men ...
- Spring Data JPA 进阶
Java持久化查询语言概述 Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式,将SQL语法和简单查询语义绑定在一起,使用这种语言编写的查询是可移植的,可以被编 ...
- 阿里oss上传图片react组件alioss-react,vue组件alioss-vue (不用我先收藏着,后端看下前端处理方法)
1.介绍 最近开发了一个项目,其中需要一个上传图片到阿里云的 oss 上面,就是上传图片到阿里云的 oss 上面. 因为之前开发过 vue 的阿里云 oss 上传,所以直接复制粘 vue 的组件. 因 ...
- Java根据百度API获得经纬度,然后根据经纬度在获得城市信息
原文:http://www.open-open.com/code/view/1421032487812 import java.io.BufferedReader; import java.io.IO ...
- 使用图像扫描控件ScanOnWeb实现在线图像扫描
今天上网查资料,看到一篇文章,描述的是一个开发OA软件的公司解决浏览器嵌入式扫描仪编程的文章,文章描述了改OA厂商的工程师如何辛苦的克服了各种技术难题,最终实现了在线图像扫描处理,然后又在无数个不眠的 ...
- 关于Chrome谷歌浏览器开发者工具网络Network中返回无数据的问题
1.如图所示,对于有些js文件,响应中无返回数据,Failed to load response data,当然本来是应该有数据,你用火狐浏览器看,就是有的,或者直接在浏览器地址栏里输入url,也可以 ...
- 利用WiFi Pineapple Nano渗透客户端获取SHELL
前言: 前两篇文章介绍了The WiFi Pineapple Nano设备的一些主要功能模块,例如PineAP.SSLsplit和Ettercap等.今天给大家实际场景演示下如何利用Pineapple ...
- [Unit Testing] Mock an HTTP request using Nock while unit testing
When testing functions that make HTTP requests, it's not preferable for those requests to actually r ...