数学专题B2—裴蜀定理
数学专题B2—裴蜀定理
P4549 裴蜀定理
裴蜀定理
题目思路
显然由前置知识可知: 对于当前的 和 , 所以代码如下:
#include
using namespace std;
#define int long long
signed main(){
int n,x,ans;
cin>>n>>ans;
for(int i=2;i>x;
ans=abs(__gcd(ans,abs(x)));
}
cout
`#include
using namespace std;
#define int long long
signed main(){
int n,x,ans;
cin>>n>>ans;
for(int i=2;i
cin>>x;
ans=abs(__gcd(ans,abs(x)));
}
cout
return 0;
}`
P1082 同余方程
扩展欧几里得
扩展欧几里得是用来解决 的一组解的。 设一组解为 ,一组解为 根据欧几里得算法(辗转相除法)可知:, 所以就有: 解得: \begin{cases} x_1=y_2 \\ y_1=x_2-\lfloor\frac{a}{b} \rfloor y_2 \end{cases} 根据这个递归即可。 代码:
void exgcd(int a,int b){
if(b==0){
/*
通过欧几里得算法(辗转相除法),
最终b一定会变为0,
这个时候gcd(a,b)=a,
所以直接令x=1即可,y可以取任意值
*/
x=1,y=0;
return;
}
exgcd(b,a%b);//传递当前方程
int lx=x;
x=y,y=lx-a/b*y;
}
`void exgcd(int a,int b){
if(b==0){
/*
通过欧几里得算法(辗转相除法),
最终b一定会变为0,
这个时候gcd(a,b)=a,
所以直接令x=1即可,y可以取任意值
*/
x=1,y=0;
return;
}
exgcd(b,a%b);//传递当前方程
int lx=x;
x=y,y=lx-a/b*y;
}`
题目思路
题目可以转化为求 的最小正整数解, 又因为其保证了有解, 所以我们可以知道 。 所以直接扩欧。 代码:
#include
using namespace std;
int A,B,x,y;
void exgcd(int a,int b){
if(b==0){
x=1,y=0;
return;
}
exgcd(b,a%b);
int lx=x;
x=y,y=lx-a/b*y;
}
int main(){
cin>>A>>B;
exgcd(A,B);
x=(x%B+B)%B;//最小正整数解
cout
`#include
using namespace std;
int A,B,x,y;
void exgcd(int a,int b){
if(b==0){
x=1,y=0;
return;
}
exgcd(b,a%b);
int lx=x;
x=y,y=lx-a/b*y;
}
int main(){
cin>>A>>B;
exgcd(A,B);
x=(x%B+B)%B;//最小正整数解
cout
return 0;
}`
P1516 青蛙的约会
题目可以简化为求出一个最小的 使得: 开始吟唱: 令 , 则有 , 此时就可以用扩欧求出 的一组解。 设该解为 , 则继续吟唱: 所以得到代码:
#include
using namespace std;
#define int long long
int xx,yy,x,y,m,n,l,g,a1,b1,c1;
int exgcd(int a,int b){
if(b==0){
xx=1,yy=0;
return a;
}
int rtn=exgcd(b,a%b),lx=xx;
xx=yy,yy=lx-a/b*yy;
return rtn;
}
signed main(){
cin>>x>>y>>m>>n>>l;
a1=n-m,b1=l,c1=x-y;
if(a1
`#include
using namespace std;
#define int long long
int xx,yy,x,y,m,n,l,g,a1,b1,c1;
int exgcd(int a,int b){
if(b==0){
xx=1,yy=0;
return a;
}
int rtn=exgcd(b,a%b),lx=xx;
xx=yy,yy=lx-a/b*yy;
return rtn;
}
signed main(){
cin>>x>>y>>m>>n>>l;
a1=n-m,b1=l,c1=x-y;
if(a10) a1=-a1,c1=-c1;
g=exgcd(a1,b1);
if(c1%g) cout"Impossible";
else cout
return 0;
}`