BZOJ2480: Spoj3105 Mod

已知数a,p,b,求满足a^x≡b(mod p)的最小自然数x。p不一定是素数。

先附上AekdyCoin大牛的题解:http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4

然后我们来证明算法的正确性。

不妨认为我们消因子后,a->a,b->b‘,c->c‘,d,e(指文中的D),除去的gcd之积为f,且(a,c‘)=1

那么其实 a^d=f*e,然后我们用BSGS求解 e*a^x=b‘ mod c‘ 因为(a,c‘)=1

而且x就是(a^inf,c)

然后假设我们得到了一个解  e*a^x=b‘ mod c‘ 考虑回推出原同余方程的解。

由裴蜀定理值存在唯一的  e*a^x+c‘*y=b‘  (注意现在是等号,而不是模意义)

我们在等式两边乘以f,就得到了 a^d*a^x+c*y=b ,也就是a^(d+x)=b mod c,这说明x+d是原方程的解。

我知道公式写成这样是没人耐心看的

还是看代码比较亲切

map<int,int>mp;
inline int gcd(int x,int y){return y?gcd(y,x%y):x;}
inline int power(int x,int y,int p)
{
    int t=1;
    for(;y;y>>=1,x=(ll)x*x%p)
     if(y&1)t=(ll)t*x%p;
    return t;
}
inline int solve(int a,int b,int c)
{
    a%=c;b%=c;
    for(int i=0,j=1;i<=50;i++,j=(ll)j*a%c)if(j==b)return i;
    int d=0,e=1%c,t;
    while((t=gcd(a,c))!=1)
    {
        if(b%t)return -1;
        c/=t;b/=t;d++;e=(ll)e*a/t%c;
    }
    mp.clear();
    int m=ceil(sqrt(c));
    for(int i=0,j=1;i<m;i++,j=(ll)j*a%c)mp[(ll)b*j%c]=i;
    a=power(a,m,c);
    for(int i=0,j=e;i<=m;i++,j=(ll)j*a%c)
     if(i&&mp.find(j)!=mp.end())
       return  i*m-mp[j]+d;
    return -1;
}
int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    while(1)
    {
        int a=read(),c=read(),b=read(),t;
        if(!(a||b||c))break;
        if((t=solve(a,b,c))>=0)printf("%d\n",t);
        else printf("No Solution\n");
    }
    return 0;
}
时间: 2024-10-13 04:51:06

BZOJ2480: Spoj3105 Mod的相关文章

【BZOJ1467/2480】Pku3243 clever Y/Spoj3105 Mod EXBSGS

[BZOJ1467/2480]Pku3243 clever Y/Spoj3105 Mod Description 已知数a,p,b,求满足a^x≡b(mod p)的最小自然数x. Input 每个测试文件中最多包含100组测试数据. 每组数据中,每行包含3个正整数a,p,b. 当a=p=b=0时,表示测试数据读入完全. Output 对于每组数据,输出一行. 如果无解,输出“No Solution”(不含引号),否则输出最小自然数解. Sample Input 5 58 33 2 4 3 0 0

(ex)BSGS题表(已完成)

学了一下BSGS大概知道他是什么了,但是并没有做什么难题,所以也就会个板子.普通的BSGS,我还是比较理解的,然而exBSGS我却只理解个大概,也许还会个板子......(这个东西好像都会有一群恶心的讨论......)bzoj3239:Discrete Logging *纯板子bzoj2242:[SDOI2011]计算器 *一群纯板子bzoj4128:Matrix *知道矩阵乘法+BSGS思想bzoj3122:[Sdoi2013]随机数生成器 ***数学推导(可以从等比数列求和推,也可以推通项,

【BZOJ】【2480】【SPOJ 3105】Mod

扩展BSGS Orz zyf……然而他的题解对AC大神的题解作了引用……而坑爹的百度云……呵呵了... 扩展BSGS模板题 1 /************************************************************** 2 Problem: 2480 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:6948 ms 7 Memory:2212 kb 8 ***********************

[note]BSGS &amp; exBSGS

BSGS (感觉这东西还是要写一下) BSGS主要用于求解形如\(x^k=y\pmod p\)(注意这里p与x互质)这样的方程的最小正整数解的问题 设\(m=\lceil\sqrt p\rceil,k=am-b,a\in[1,m],b\in[0,m)\) 那么上面的方程可以变形成\(x^{am}=yx^b\pmod p\) 枚举\(b\),计算出右边的值存到\(map\)中,枚举\(a\)查表即可 Q:可以枚举左边存表,右边查嘛? A:可以,但是左边查到表可以直接输出... 顺便一说,map里要

能蜜履拖栖cn0ih1010n15

听着天梦冰蚕的讲述,霍雨浩早已忘记了恐惧,义愤填膺的道:"它们太可恶了,怎么能这样,居然囚禁了你近万年之久."巫风右腿闪电般弹起,直奔倒下的霍雨浩踢去,她这一下速度极快.眼看就要踢中霍雨浩的胸膛了.先前天梦冰蚕散发出的强大精神力曾经令他们暂时失去思索的能力,不过因为他们与天梦冰蚕之间的对比相差太大所以并未察觉.但此时近在咫尺的霍雨浩就不同了,那份由眼眸散发出的精神波动令两人都是大吃一惊.磕头认错虽然不会伤残身体,但毫无疑问,无论输赢如何,这两个小团体都是结下大仇了.双方都有武魂系两名核

赜稳蔷擞苏a6del17necnkycg3k4

徐三石的作用可以说是完美展现,发动玄冥震之后,他根本没有停顿,身体一横,就闪了出来,玄冥置换光芒再现.史莱克战队这边,戴钥衡已经横跨一步迈了出来.只要玄冥置换再次成功,那么,史莱克学院这第二位魂帝也将被置换过去.一年多前,他独自一人离开公爵府来到星斗大森林,那时怀着不成功.则成仁的想法.如果不能获取一个何时的魂环,可能就会死在星斗大森林中,成为这里植物的养分.那时候的他,心中除了决绝就是对报仇的渴望.久久公主眼神平淡的看了一眼光罩外的冰雾,嘴角微微上翘,在她身前还有一名魂师.却始终没有加入战斗.

羡崖孪廖俗qpcrvfn725y6bm

"当我想到唐门的时候,我惊讶的发现,实际上,我所有的能力都可以和唐门有关.我的灵眸武魂,本身和紫极魔瞳就有着众多关系,正是通过紫极魔瞳,才让我拥有了灵魂冲击这样的精神系能力.反过来说,我的灵眸武魂在精神控制方面的造诣也同样能够帮助我来施展各种唐门绝学,这其中就包括唐门暗器.而冰碧帝皇蝎武魂就更不用说了,冰系魂技与唐门的各种擒拿.步法有效的结合在一起,就如王冬刚才所说的那样,必定能够令我的实战能力大大提升."第十章 初涉魂导器(三)此时,众人的目光都集中在霍雨浩身上.就连玄老也不例外.大

MOD - Power Modulo Inverted(SPOJ3105) + Clever Y(POJ3243) + Hard Equation (Gym 101853G ) + EXBSGS

思路: 前两题题面相同,代码也相同,就只贴一题的题面了.这三题的意思都是求A^X==B(mod P),P可以不是素数,EXBSGS板子题. SPOJ3105题目链接:https://www.spoj.com/problems/MOD/ POJ3243题目链接:http://poj.org/problem?id=3243 题目: 代码实现如下: 1 #include <set> 2 #include <map> 3 #include <queue> 4 #include

51nod1039 x^3 mod p

X*X*X mod P = A,其中P为质数.给出P和A,求<=P的所有X. Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 1000) 第2 - T + 1行:每行两个数P A,中间用空格隔开.(1 <= A < P <= 10^9, P为质数) Output 共T行,每行包括符合条件的X,且0 <= X <= P,如果有多个,按照升序排列,中间用空格隔开.如果没有符合条件的X,输出:No Solution 首先求P的原