g c d ( a , b ) = m i n ( q a − p b ) ( q a ! = p b ) gcd(a,b)=min(qa-pb) (qa!=pb) gcd(a,b)=min(qa−pb)(qa!=pb)
可用欧几里得扩展证明, q ∗ a − p ∗ b = g q*a-p*b=g q∗a−p∗b=g,若有整数解则 g = k ∗ g c d ( a , b ) , m i n ( g ) 时 k = 1 g=k*gcd(a,b),min(g)时 k=1 g=k∗gcd(a,b),min(g)时k=1
传送门:Infinite Fence
题意:判断
(
r
<
b
)
p
∗
b
(
p
−
1
)
∗
b
(r<b) p*b~(p-1)*b
(r<b)p∗b (p−1)∗b之间 r的倍数是否少于k
#include<bits/stdc++.h>
using namespace std;
int main(){
int T;
scanf("%d",&T);
while(T--){
int r,b,k;
scanf("%d%d%d",&r,&b,&k);
int t=__gcd(r,b);
if((max(r,b)-t-1)/min(r,b)+1<k) cout<<"OBEY"<<endl;
else cout<<"REBEL"<<endl;
}
return 0;
}
g c d ( a , b ) gcd(a,b) gcd(a,b)的所有因子是a,b的所有公约数.
将a,b分解质因子,g=gcd(a,b),质因子的指数
p
g
=
m
i
n
(
p
a
,
p
b
)
p_g=min(p_a,p_b)
pg=min(pa,pb),所以这些公共质因子组成了g,他们所有的公约数都是有这些质因子组成的,所以直接求g的因子。
传送门:约数
题意:求a,b的全部公约数
#include<bits/stdc++.h>
using namespace std;
set<long long> st;
int main(){
long long a,b;
scanf("%lld%lld",&a,&b);
long long Gcd=__gcd(a,b);
long long t=sqrt(Gcd);
for(int i=1;i<=t;++i){
if(Gcd%i==0){
st.insert(i);
if(Gcd/i!=i) st.insert(Gcd/i);
}
}
set<long long > ::iterator it=st.begin();
for(;it!=st.end();++it){
cout<<*it<<" ";
}
return 0;
}
传送门:A. Good ol’ Numbers Coloring
题意:可以把
x
∗
a
+
y
∗
b
x*a+y*b
x∗a+y∗b号牌子涂成白色,其他为黑色,假设有1-无穷个牌子,黑色牌子是否无穷
题解:
x
∗
a
+
y
∗
b
=
k
∗
g
c
d
(
a
,
b
)
x*a+y*b=k*gcd(a,b)
x∗a+y∗b=k∗gcd(a,b)若有有限个黑色牌子,在某一位置开始后
k
∗
g
,
k
∗
g
+
1
,
k
∗
g
+
2......
k*g,k*g+1,k*g+2... ...
k∗g,k∗g+1,k∗g+2......都是白色,
x
∗
a
+
y
∗
b
x*a+y*b
x∗a+y∗b连续需
g
c
d
(
a
,
b
)
=
1
,
k
∗
g
c
d
(
a
,
b
)
gcd(a,b)=1,k*gcd(a,b)
gcd(a,b)=1,k∗gcd(a,b)才能连续
#include<bits/stdc++.h>
using namespace std;
set<int> s;
int main(){
int T;
scanf("%d",&T);
while(T--){
int a,b;
s.clear();
scanf("%d%d",&a,&b);
if(__gcd(a,b)==1){
cout<<"Finite"<<endl;
}
else cout<<"Infinite"<<endl;
}
return 0;
}