题目大意
给出a,b,按照图中要求染色,问黑色格子是否是有限个(Finite)。
解题思路
这是codeforce官方题解:
根据染色要求,一个格子如果能表示成
a
x
+
b
y
(
a
,
b
为
整
数
)
ax+by(a,b为整数)
ax+by(a,b为整数)的形式,那么这个格子可以被染成白色。由数学知识可以知道ax+by % gcd(a,b) = 0
,反之任意不能被
g
c
d
(
a
,
b
)
gcd(a,b)
gcd(a,b)整除的数都不能表示成
a
x
+
b
y
ax+by
ax+by的形式。
接下来证明,任意一个数 x ′ ( x ′ > = a ∗ b ) x^{'}(x^{'}>=a*b) x′(x′>=a∗b)能用两个互质的数 ( a , b ) (a,b) (a,b)来表示。
构造集合 S = { x ′ , x ′ − a , x ′ − 2 a , … , x ′ − ( b − 1 ) a } S = \{x^{'}, x^{'} - a, x^{'} - 2a, \dots, x^{'} - (b - 1) a\} S={x′,x′−a,x′−2a,…,x′−(b−1)a},如果集合中任何一个数被染成白色,那么按照染色队则 x x x也被染成白色。首先 S S S集合中有b个元素,假设这些元素都不能被 b b b整除,(一不能整除b的数 对 b b b的余数只有b-1个,集合中有b个数,对b取余就会产生b种余数)根据鸽巢定理,这个集合中一定存在两个不同的数 x ′ − s a , x ′ − t a ∈ S ( s < t ) x^{'} - sa, x^{'} - ta \in S (s<t) x′−sa,x′−ta∈S(s<t)对b取余之后余数一样,那么 ( x ′ − s a ) − ( x ′ − t a ) = a ( t − s ) % b = 0 (x^{'} - sa) - (x^{'} - ta) = a (t - s)\% b=0 (x′−sa)−(x′−ta)=a(t−s)%b=0,由于a,b互质,那么 t − s t-s t−s整除 b b b,也就是 t − s = k b , k > = 1 t-s=kb,k>=1 t−s=kb,k>=1,由于 x ′ − s a , x ′ − t a ∈ S ( s < t ) x^{'} - sa, x^{'} - ta \in S (s<t) x′−sa,x′−ta∈S(s<t),可知 t < b , s < b , ( t − s ) < b t<b,s<b,(t-s)<b t<b,s<b,(t−s)<b,所以 t − s t-s t−s整除 b b b不成立,假设不成立。
也就是集合S中一定存在一个能整除b的数,这个能整除b的数 x ′ − s a x^{'}-sa x′−sa能表示成 a x + b y ax+by ax+by的形式,被染成白色,这个数加上 s a sa sa得到 x ′ x^{'} x′,也能染成白色。这样就证明了任意一个数 x ′ ( x ′ > = a ∗ b ) x^{'}(x^{'}>=a*b) x′(x′>=a∗b)能表示成 a x + b y ax+by ax+by的形式。
#include <bits/stdc++.h>
using namespace std;
int t,a,b;
int main(){
cin>>t;
while(t--){
cin>>a>>b;
if(__gcd(a,b)==1)cout<<"Finite\n";
else cout<<"Infinite\n";
}
return 0;
}