调了一周,我真制杖,,,

各种初始化没有设为1,,,我当时到底在想什么???

拓展BSGS,这是zky学长讲课的课件截屏:

是不是简单易懂。PS:聪哥说“拓展BSGS是偏题,省选不会考,信我没错”,那是因为聪哥早就会了,所以他觉得学这个没用,信他才怪233

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
LL A,B,C;
struct node{
static const int mo=100007;
LL a[mo],v[mo];
void clear() {memset(a,-1,sizeof(a));}
LL find(LL val){
LL pos=(val%mo+mo)%mo;
while ((a[pos]!=val)&&(a[pos]!=-1)) pos=(pos+1)%mo;
return pos;
}
void insert(int val,int x){
LL pos=find(val);
if ((a[pos]==-1)||(a[pos]==val)){
a[pos]=val; v[pos]=x;
}
}
LL get(LL val){
LL pos=find(val);
return a[pos]==val?v[pos]:-1;
}
}hash;
LL gcd(LL x,LL y) {LL r=x%y; while (r!=0){x=y; y=r; r=x%y;} return y;}
void exgcd(LL aa,LL bb,LL &x, LL&y){
if (bb==0){
x=1; y=0; return;
}
exgcd(bb,aa%bb,x,y);
LL t=y;
y=x-aa/bb*y;
x=t;
}
LL ni(LL a,LL b){
LL x,y;
exgcd(a,b,x,y);
return (x+C)%C;
}
LL ipow(LL a,LL b,LL c){
LL ans=1,t=a;
while (b){
if (b%2==1) ans=(ans*t)%c;
t=(t*t)%C; b/=2;
}
return ans;
}
void bsgs(){
B%=C;
if (B==1) {puts("0"); return;}
else if ((A==0)&&(B==0)) {puts("1"); return;}
else if (B==0) {puts("No Solution"); return;}
LL t=1;
for(LL i=0;i<=50;++i){
if (t==B){
printf("%I64d\n",i);
return;
}
t=(t*A)%C;
}
LL g,ans1=0,D=1;
while ((g=gcd(A,C))!=1){
if (B%g){
puts("No Solution");
return;
}
++ans1;
B/=g;
C/=g;
D=(A/g*D)%C;
}
D=ni(D,C);
LL m=ceil(sqrt((double)C));
hash.clear();
t=B*D%C;
for(LL i=0;i<=m;++i){
hash.insert(t,i);
t=(t*A)%C;
}
LL basic=ipow(A,m,C);
t=1;
for(LL i=0;i<=m;++i){
int x=hash.get(t);
if (x!=-1){
printf("%I64d\n",ans1+i*m-x);
return;
}
t=(t*basic)%C;
}
puts("No Solution");
}
int main(){
while (scanf("%I64d %I64d %I64d\n",&A,&C,&B)){
if ((A==0)&&(B==0)&&(C==0)) break;
bsgs();
}
return 0;
}

这样就可以啦

【POJ 3243】Clever Y 拓展BSGS的更多相关文章

  1. POJ 3243 Clever Y 扩展BSGS

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

  2. 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 ...

  3. poj 3243 Clever Y && 1467: Pku3243 clever Y【扩展BSGS】

    扩展BSGS的板子 对于gcd(a,p)>1的情况 即扩展BSGS 把式子变成等式的形式: \( a^x+yp=b \) 设 \( g=gcd(a,p) \) 那么两边同时除以g就会变成: \( ...

  4. POJ 3243 Clever Y | BSGS算法完全版

    题目: 给你A,B,K 求最小的x满足Ax=B (mod K) 题解: 如果A,C互质请参考上一篇博客 将 Ax≡B(mod C) 看作是Ax+Cy=B方便叙述与处理. 我们将方程一直除去A,C的最大 ...

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

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

  6. [POJ 3243]Clever Y

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

  7. POJ 3243 Clever Y Extended-Baby-Step-Giant-Step

    题目大意:给定A,B,C,求最小的非负整数x,使A^x==B(%C) 传说中的EXBSGS算法0.0 卡了一天没看懂 最后硬扒各大神犇的代码才略微弄懂点0.0 參考资料: http://quarter ...

  8. poj 3243 Clever Y 高次方程

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

  9. poj3243 Clever Y[扩展BSGS]

    Clever Y Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 8666   Accepted: 2155 Descript ...

随机推荐

  1. POJ 1696 Space Ant --枚举,模拟,贪心,几何

    题意: 有很多点,从最右下角的点开始走起,初始方向水平向右,然后以后每步只能向左边走,问最多能走多少个点. 解法: 贪心的搞的话,肯定每次选左边的与它夹角最小的点,然后走过去. 然后就是相当于模拟地去 ...

  2. GNU make简要介绍①指定变量、自动推导规则、清除工作目录过程文件

    Makefile简介 在执行make之前需要一个命名为Makefile的特殊文件来告诉make需要做些什么. 当使用 make 工具进行编译时,工程中以下几种文件在执行 make 时将会被编译 (重新 ...

  3. hibernate save,update,saveorupdate方法有什么区别

    save肯定是添加的时候用,update修改时候用,saveorupdate是添加或修改,如果真是这样save和update的存在就没意义了,我们直接saveorupdate就行了. save在添加用 ...

  4. Func<T,TResult>泛型委托

    描述: 封装一个具有一个参数并返回TResult参数指定的类型值的方法. 语法: public delegate TResult Func<T,TResult>(T arg); 参数类型: ...

  5. NSIS来自己设定快捷方式的图标

    CreateShortCut 快捷文件.lnk 目标文件 参数 图标文件 图标索引号 启动选项 键盘快捷键 描述 CreateShortCut "$DESKTOP\快捷方式.lnk" ...

  6. 树莓派B+安装archlinux arm版

    按Archlinux官网操作而来,如有疑问参照官网:http://archlinuxarm.org/platforms/armv6/raspberry-pi 以我自己安装过程举例,我的SD卡挂载在ub ...

  7. 使用Proguard做Java代码混淆

    下载Proguard, 我下的是最新的Proguad5.2 在windows下运行bin/proguardgui.bat, 可以看见图形界面, 载入配置, 然后process. 配置文件例子 -inj ...

  8. 轉發XML

    Delphi 中的 XMLDocument 类详解(3) - 读取 xml 文件 先虚拟一个测试文件: test.xml; 放在 c:\temp\ 下备用. <?xml version=&quo ...

  9. ubuntu 12.04下zmap安装

    zmap介绍 https://zmap.io/ ----------------华丽的分割线---------------- zmap 1.03 的安装 Step1: sudo apt-get ins ...

  10. 笔记 (note)

    笔记[问题描述]给定一个长度为m的序列a,下标编号为1~m.序列的每个元素都是1~n的整数.定义序列的代价为m−1 ∑|ai+1-ai| i=1 你现在可以选择两个数x和y,并将序列a中所有的x改成y ...