扩展欧几里得,解线性同余方程 逆元 poj1845
定理:对于任意整数a,b存在一堆整数x,y,满足ax+by=gcd(a,b)
int exgcd(int a,int b,int &x,int &y){
if(b==){x=,y=;return a;}
int d=exgcd(b,a%b,x,y);
int z=x;x=y;y=z-y*(a/b);
return d;
}
当d可以整除c时,一般方程ax+by=c的一组特解求法:
1.求ax+by=d的特解x0,y0
2.ax+by=c的特解为(c/d)x0,(c/d)y0
上述方程的通解:(c/d)x0+k(b/d) ,(c/d)y0-k(a/d)
乘法逆元有自然数倒数的类似性质
乘法逆元:b,m互质,并且b整除a,则存在x,有a/b = a*x(mod m),即a/b模m的结果和a*x模m的结果是相同的,这个x称为b的模m的乘法逆元,记作b^(-1) (mod m)
可得b*b^(-1) = 1(mod m)
那么当m是质数时,根据费马小定理,有b^(m-1)=1(mod m),那么b的逆元就是b^(m-2)
如果只是保证b,m互质,那么解同余方程b*x=1(mod m)可以求出x
所以当遇到除法取模运算时,可以先求出逆元,转换成乘法取模运算
/*
如果单独是个A,那么就可以分解质因数后用公式求约数个数
那么B个A相乘,其约数个数就是mul{1+p^1+p^2...+p^B*ci}
结果是比数列求和后再相乘,每项等比数列的结果是
(pi^(B*ci+1)-1)/(pi-1) mod9901,
1.pi-1不是9901的倍数,(pi-1)^(9901-2)就是逆元
2.pi-1是9901的倍数,逆元不存在,但是pi mod 9901=1。。。 先把A分解质因数,再等比数列求和(快速幂+逆元),
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
#define mod 9901 int m,p[],c[];
void divide(int n){
m=;
for(int i=;i*i<=n;i++)
if(n%i==){
p[++m]=i,c[m]=;
while(n%i==) n/=i,c[m]++;
}
if(n>) p[++m]=n,c[m]=;
}
ll pow(ll a,ll b){
ll res=;
while(b){
if(b&) res=res*a%mod;
a=a*a%mod;
b>>=;
}
return res;
} int main(){
ll a,b,ans=;
scanf("%lld%lld",&a,&b);
divide(a);//分解质因数
for(int i=;i<=m;i++){
if((p[i]-)%mod==){
ans=ans*(b*c[i]+)%mod;
continue;
}
//求分子和分母逆元
ll x=pow(p[i],b*c[i]+)%mod;
x=(x-+mod)%mod;
ll y=pow(p[i]-,mod-)%mod;
ans=ans*x%mod*y%mod;
}
printf("%lld\n",ans);
}
求解同余方程:a*x=b(mod m)等价于a*x-b是m的倍数,等价于a*x+m*y=b,当gcd(a,m)|b时,有解
按照拓展欧几里得算法,可解得特解x=x0*b/gcd(a,m)就是原线性同余方程的一个解
通解为所有模m/gcd(a,m)与x同余的整数
求解同余方程:noip2012:a*x=1(mod b)的最小整数解
#include<bits/stdc++.h>
using namespace std;
#define ll long long ll a,b,x,y;
ll exgcd(ll a,ll b,ll &x,ll &y){
if(!b){x=;y=;return a;}
ll d=exgcd(b,a%b,x,y);
ll z=x; x=y,y=z-y*(a/b);
return d;
}
int main(){
cin >> a >> b;
exgcd(a,b,x,y);//x可能是负数
cout << (x%b+b)%b<<endl;
}
扩展欧几里得,解线性同余方程 逆元 poj1845的更多相关文章
- Poj 1061 青蛙的约会(扩展欧几里得解线性同余式)
一.Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要 ...
- poj 1061 扩展欧几里得解同余方程(求最小非负整数解)
题目可以转化成求关于t的同余方程的最小非负数解: x+m*t≡y+n*t (mod L) 该方程又可以转化成: k*L+(n-m)*t=x-y 利用扩展欧几里得可以解决这个问题: eg:对于方程ax+ ...
- 【扩展欧几里得】NOIP2012同余方程
题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正 ...
- poj 2142 扩展欧几里得解ax+by=c
原题实际上就是求方程a*x+b*y=d的一个特解,要求这个特解满足|x|+|y|最小 套模式+一点YY就行了 总结一下这类问题的解法: 对于方程ax+by=c 设tm=gcd(a,b) 先用扩展欧几里 ...
- POJ2115 - C Looooops(扩展欧几里得)
题目大意 求同余方程Cx≡B-A(2^k)的最小正整数解 题解 可以转化为Cx-(2^k)y=B-A,然后用扩展欧几里得解出即可... 代码: #include <iostream> us ...
- C. Ray Tracing——披着搜索外衣的扩展欧几里得
[题目大意] 给你一个n*m的矩形,光线从(0,0)出发,沿右上方向以每秒根号2米的速度运动,碰到矩形边界就会反弹(符合物理规律的反弹),询问k个点,这些点都在矩形内部且不在矩形边界上,求光经过这些点 ...
- bzoj1407 [Noi2002]Savage——扩展欧几里得
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1407 看到一定有解,而且小于10^6,所以可以枚举: 判断一个解是否可行,就两两判断野人 i ...
- Uva12169 扩展欧几里得模板
Uva12169(扩展欧几里得) 题意: 已知 $x_i=(a*x_{i-1}+b) mod 10001$,且告诉你 $x_1,x_3.........x_{2t-1}$, 让你求出其偶数列 解法: ...
- 【Luogu】P1516青蛙的约会(线性同余方程,扩展欧几里得)
题目链接 定理:对于方程\(ax+by=c\),等价于\(a*x=c(mod b)\),有整数解的充分必要条件是c是gcd(a,b)的整数倍. ——信息学奥赛之数学一本通 避免侵权.哈哈. 两只青蛙跳 ...
随机推荐
- Python/spss-多元回归建模-共线性诊断1(推荐A)
欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction ...
- GO语言的进阶之路-Golang高级数据结构定义
GO语言的进阶之路-Golang高级数据结构定义 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们之前学习过Golang的基本数据类型,字符串和byte,以及rune也有所了解, ...
- shell if [[ ]]的一次应用
直接上代码 #!/bin/bash A="$1" if [[ "$A" == a* ]];then echo "aaa" else echo ...
- xshell访问Ubuntu16.04显示乱码(即使在xshell设置了utf8)解决方案
一开始问题是:(无法显示,也无法输入) 然后使用: locale -a 查看服务器安装的全部编码: (且服务器使用的 LANG=C) 只要用: 即可显示中文.也可以输入中文.
- HTML语义化
什么是HTML语义化呢? 根据内容的结构化(内容语义化),选择合适的标签(代码语义化),便于开发者阅读,写出优雅的代码的同时让浏览器的爬虫更好的解析 语义化标签的优势: 1)代码结构清晰,方便阅读 2 ...
- ARMCortex系列仿真调试器
主流的调试工具1. J-LinkJ-Link是最著名的ARM开发调试工具,J-Link由SEGGER公司生产.提供对市面上几乎所有ARM内核芯片的支持.目前最新版本的J-Link产品为V8,支持JT ...
- SmartUpload文件上传组件的使用教程
在项目中使用SmartUpload组件可以进行文件的上传和下载操作 使用步骤 1.导入jar包,进行build path操作 2.编写文件上传页面,代码如下 <form action=" ...
- 二、主目录 Makefile 分析(2)
2.7 编译选项---config.mk 代码 163 164 行 # load other configuration include $(TOPDIR)/config.mk 此段就是包含顶层目录下 ...
- Linux - 进程服务资源
1.进程查看操作管理 ps -eaf # 查看所有进程 kill - PID # 强制终止某个PID进程 kill - PID # 安全退出 需程序内部处理信号 cmd & # 命令后台运行 ...
- 如何在linux系统下配置无线网卡?【转】
转自:http://www.jb51.net/LINUXjishu/61315.html 本文介绍在Linux 命令行界面中手动配置无线网卡的方法.目前流行的多数发行版都支持用图形界面的network ...