概述
线性同余方程刷题小记
- T1:同余方程
- T2:青蛙的约会
T1:同余方程
题目链接: P1082 [NOIP2012 提高组] 同余方程
题目分析: 这个貌似比板子题都要简单一些,所以我们可以用简化一点的方法。
a
x
≡
1
(
m
o
d
b
)
axequiv 1(mod b)
ax≡1(mod b)的解即为
a
x
+
b
y
=
1
ax+by=1
ax+by=1的
x
x
x的解,根据题目中说的一定有解,而
g
c
d
(
a
,
b
)
∣
1
gcd(a,b)|1
gcd(a,b)∣1时才有解,所以
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b)为1,
a
a
a,
b
b
b互质,所以直接拓展欧几里得算出一组特解,然后
(
x
0
%
b
+
b
)
%
b
(x_0%b+b)%b
(x0%b+b)%b即为答案
Code:
#include<bits/stdc++.h>
using namespace std;
int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1;y=0;
return a;
}
int r=exgcd(b,a%b,x,y);
int xx=x;
x=y;
y=xx-a/b*y;
return r;
}
int main(){
scanf("%d%d",&A,&B);
exgcd(A,B,X,Y);
X=(X%B+B)%B;
printf("%d",X);
return 0;
}
总结与反思:
学会从题目中找到这个题的数据的特点,从而简化算法
T2:青蛙的约会
题目: P1516 青蛙的约会
题目分析: 根据题意,不难将本题转化为一个数学方程式,即
x
+
m
t
≡
y
+
n
t
(
m
o
d
L
)
x+mtequiv y+nt (mod L)
x+mt≡y+nt (mod L),(
t
t
t为时间),进一步转化可得出
(
m
−
n
)
t
+
k
L
=
y
−
x
(m-n)t+kL=y-x
(m−n)t+kL=y−x,即为一个线性不定方程,这里要特别注意
m
−
n
m-n
m−n要大于零,否则将两只青蛙的属性要颠倒一下。
Code:
#include<bits/stdc++.h>
using namespace std;
long long X,Y,M,N,L,XX,YY,Ans,XXX,YYY;
long long exgcd(long long a,long long b,long long &x,long long &y){
if(b==0){
x=1;y=0;
return a;
}
long long r=exgcd(b,a%b,x,y);
long long tem=x;
x=y;
y=tem-a/b*y;
return r;
}
long long equation(long long a,long long b,long long c,long long &x,long long &y){
long long d=exgcd(a,b,x,y);
if(c%d) return 0;
long long k=c/d;
x=x*k;
y=y*k;
long long ans=x,s=b/d;
ans=(ans%s+s)%s;
return ans;
}
int main(){
scanf("%lld%lld%lld%lld%lld",&X,&Y,&M,&N,&L);
if(M<N){
swap(M,N);
swap(X,Y);
}
Ans=equation(M-N,L,Y-X,XXX,YYY);
if(Ans==0) printf("Impossible");
else printf("%lld",Ans);
return 0;
}
总结与反思:
1.要注意线性不定方程的系数不能为负值
2.注意数据范围,开long long (特别注意:数论中不要开unsigned long long)
3.将题目转化为数学问题进行过解答
最后
以上就是爱笑长颈鹿为你收集整理的线性同余方程刷题小记T1:同余方程T2:青蛙的约会的全部内容,希望文章能够帮你解决线性同余方程刷题小记T1:同余方程T2:青蛙的约会所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复