题目:http://acm.hdu.edu.cn/showproblem.php?pid=3930


题意:给定同余式,求它在内的所有解,其中总是素数。

分析:解本同余式的步骤如下

(1)求模的一个原根

(2)利用Baby Step Giant Step求出一个,使得,因为为素数,所以有唯一解。

(3)设,这样就有,其中,那么得到

(4)求出所有的,可以知道一共有个解,我们求出所有的,然后排个序即可。

代码:

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <bitset>
#include <map>using namespace std;
typedef long long LL;const int N = 1000005;/**以下为求原根部分 */
bitset<N> prime;
int p[N],pri[N];
int k,cnt;void isprime()
{prime.set();for(int i=2; i<N; i++){if(prime[i]){p[k++] = i;for(int j=i+i; j<N; j+=i)prime[j] = false;}}
}void Divide(LL n)
{cnt = 0;LL t = (LL)sqrt(1.0*n);for(int i=0; p[i]<=t; i++){if(n%p[i]==0){pri[cnt++] = p[i];while(n%p[i]==0) n /= p[i];}}if(n > 1)pri[cnt++] = n;
}LL multi(LL a,LL b,LL m)
{LL ans = 0;a %= m;while(b){if(b & 1){ans = (ans + a) % m;b--;}b >>= 1;a = (a + a) % m;}return ans;
}LL quick_mod(LL a,LL b,LL m)
{LL ans = 1;a %= m;while(b){if(b&1){ans = multi(ans,a,m);b--;}b >>= 1;a = multi(a,a,m);}return ans;
}LL broot(LL p)
{Divide(p-1);for(int g=2 ;; g++){bool flag = true;for(int i=0; i<cnt; i++){LL t = (p - 1) / pri[i];if(quick_mod(g,t,p) == 1){flag = false;break;}}if(flag) return g;}
}
/**以上为求原根部分 *//** 以下为Baby_Step */LL gcd(LL a,LL b)
{return b ? gcd(b,a%b):a;
}void extend_Euclid(LL a,LL b,LL &x,LL &y)
{if(b == 0){x = 1;y = 0;return;}extend_Euclid(b,a%b,x,y);LL tmp = x;x = y;y = tmp - (a / b) * y;
}LL Inv(LL a,LL p)
{return quick_mod(a,p-2,p);
}LL Baby_Step(LL A,LL B,LL C)
{map<LL,int> mp;LL M = ceil(sqrt(1.0*C));LL t = Inv(quick_mod(A,M,C),C);LL ans = 1;for(int i=0; i<M; i++){if(!mp.count(ans))mp[ans] = i;ans = multi(ans,A,C);}for(int i=0; i<M; i++){if(mp.count(B))return i * M + mp[B];B = multi(B,t,C);}return -1;
}
/** 以上为Baby_Step */LL ans[1005];void Work(LL A,LL B,LL C)
{LL root = broot(C);LL t1 = Baby_Step(root,B,C);LL t2 = C - 1;LL d = gcd(A,t2);if(t1 % d){puts("-1");return;}LL x,y;extend_Euclid(A,t2,x,y);t2 /= d;t1 /= d;ans[0] = (x * t1 % t2 + t2) % t2;for(int i=1; i<d; i++)ans[i] = ans[i-1] + t2;for(int i=0; i<d; i++)ans[i] = quick_mod(root,ans[i],C);sort(ans,ans+d);for(int i=0; i<d; i++)cout<<ans[i]<<endl;
}int main()
{int T = 1;LL A,B,C;isprime();while(cin>>A>>C>>B){printf("case%d:\n",T++);Work(A,B,C);}return 0;
}


x^A=B(mod C)的解 (离散对数与原根)相关推荐

  1. 我的世界java版如何装mod_我的世界MOD安装详解教程 全方位介绍MOD

    我的世界这款游戏中,MOD是游戏内的一些扩展插件,因为有了MOD的存在,游戏才会变得如此精彩,同时也提高了游戏的体验和创造性.民间的牛人们大多可以通过MOD来达到官方没有做到的成绩.那么我们如果手里有 ...

  2. 离散对数(关于方程x^A=B(mod C)的解)

    首先我们来认识一下离散对数. 离散对数是一种在整数中基于同余运算和原根的对数运算.当模有原根时,设为模的一个原根,则当 时,.此处的是以整数为底模的离散对数值. 之前做过一个题,题意是这样的:求同余方 ...

  3. ax²+bx+c≡0 mod m 和 x²≡a mod p的解存在性分析

    索引 f(x)=ax2+bx+c≡0modmf\left( x \right)=a{{x}^{2}}+bx+c\equiv 0\text{ }\bmod mf(x)=ax2+bx+c≡0 modm的解 ...

  4. HDU3930(离散对数与原根)

    题目:Broot 题意:给出k,m,newx的值,求方程x^k(mod m)=newx的解,其中m为素数. 解法步骤: (1)先暴力求m的原根g (2)大步小步求g^t1(mod m)=newx (3 ...

  5. 离散对数和原根 欧拉定理证明

    http://www.cppblog.com/luyulaile/archive/2012/04/11/170855.aspx 欧拉定理证明 && 欧拉公式 源地址: http://w ...

  6. 关于方程a^x=1(mod m)的最小x解

    定理: 设gcd(a,m)=1,必有正整数x,使得a^x=1(mod m),且设满足等式的最小正整数为x0,必满足x0|phi(m).注意m>1. 否则如果gcd(a,m)!=1,则方程a^x= ...

  7. 离散对数(例题+详解+代码模板)

    题意: 给定x,n,m,求x^y=n(mod m)的解(其中m是素数) 求解一个最小的x满足给定的方程Bx == N (mod P) 使用baby_step_giant_step算法.也就是先小步后大 ...

  8. 用matlab画椭圆曲线方程,椭圆曲线入门详解

    转载请注明http://blog.csdn.net/boksic 如有疑问欢迎留言 如果不知道数学上的群.循环群等概念,可以先了解ElGamal加密算法 后再回过来椭圆曲线加密 这两个算法有共通之处, ...

  9. 数字签名(RSA签名、ElGamal签名、Schnorr签名、DSS、DSA、离散对数签名、特殊性质的签名算法、Chaum盲签名、Chaum-Antwerpen不可否认签名、群签名、MUO代理签名)

    数字签名基本概念 数字签名的必要性: 消息认证能够使通信双方对接收到的信息来源及完整性进行验证,防止第三方的攻击,然而却不能防止通信双方中的一方对另一方的欺诈. 这种欺诈有多种形式,例如通信双方(发送 ...

最新文章

  1. R语言names函数获取或者设置数据对象名称实战
  2. mysql主从复制实战
  3. BEA Workshop Studio有什么用?
  4. SpringMVC:JSON
  5. C#反序化json字符串,不用区分大小写
  6. DOM-7 【兼容】事件处理函数、冒泡捕获、阻止冒泡默认事件
  7. 前端学习(3024):vue+element今日头条管理-关于默认子路由的问题
  8. 计算机音乐绅士教程,教你学唱薛之谦的《绅士》,这个技巧很实用值得收藏!...
  9. 【Kafka】Kafka BrokerEndPointNotAvailableException: End point with security protocol PLAINTEXT not
  10. MCMC(MH算法)
  11. 因为计算机中丢失lua.dll,lua51.dll丢失修复
  12. 批量将多个 Excel 工作簿文件合并成单个 Excel 文件
  13. 获取当前的格林尼治时间
  14. 解决Microsoft已经阻止宏运行,因为此文件的来源不受信任。
  15. mysql 代理 mycat_使用MyCAT代理MySQL数据库
  16. 图像分割GrabCut
  17. java精品入门-0基础第一篇
  18. 通达信l-2服务器文件,分享两个手机版通达信的指标源码(PC端也适用)
  19. Qt QList详解
  20. mw325r设置虚拟服务器,水星MW325R无线桥接设置教程 | 192路由网

热门文章

  1. Spring 中的代理选择原则
  2. Spring-Cloud中的网关
  3. 命令提示符_基本介绍
  4. idea常用的快捷键
  5. restTemplate 传递map
  6. Spring Boot Transaction 源码解析(二)
  7. Spring Cloud Gateway 源码解析(2) —— 路由
  8. PCB电流和线宽的关系(通俗易懂)
  9. linux环境下vim创建java文件,并编译运行
  10. C# Directory.Exists() 文件存在但返回一直为false