题目描述
小蓝家要装修了,小蓝爸爸买来了很多块(你可以理解为数量无限)2×3规格的地砖,小蓝家的地板是n × m规格的,小蓝想问你,能否用这些2×3的地砖铺满地板。
铺满地板:对于地板的每个区域,都有且只有一块地砖覆盖,地砖可以旋转,但不能切割。
例如:对于7×6的地板,一种铺地板方式是:
当然,也存在其他别的铺法。
小蓝家是个多层小别墅,每一层的规格不一样,所以他会多次询问你不同规格的地板。
输入格式
第一行输入一个整数T,代表询问数量。
接下来T行,每行两个正整数ni, mi,代表小蓝询问的地板规格。
输出格式
对于每次询问,如果2×3的地砖可以铺满地板,输出Yes,否则输No。
输入样例
在这里给出一组输入。例如:
4
7 6
2 2
12 8
1 12
输出样例
在这里给出相应的输出。例如:
Yes
No
Yes
No
这道题目考察了数论,如果不会的话写暴力如果数据点比较强很有可能过不了
刚开始写了个搜索判断能不能由2,3组成,但是不知道为什么搜索过不了qwq
数论结论是对于两个互质的数a,b,存在的最大的不能由这两个数组合出来的整数是
a*b-a-b
对于地板的两条边来说,只要其的边长可以由a,b自由组合出来,那么其就可能存在满足条件的摆法。
最终答案就是上面的条件满足外额外满足地板面积是地砖面积的整数倍即可
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
#define endl "\n"
#define maxLine 110
#define long long int ll;
ll splitA=2;
ll splitB=3;
ll calc(ll a,ll b){
// 计算最大的不能表示的数字
return a*b-a-b;
}
int main() {
int n;
cin>>n;
int a,b;
int nums=calc(splitA,splitB);
for(int i=1; i<=n; i++){
cin>>a>>b;
if (((a*b)%(splitA*splitB)==0) && (a>nums) && (b>nums) ){
cout<<"Yes";
}
else {
cout<<"No";
}
cout<<endl;
}
return 0;
}
这里面注意,取模符号(%)和乘除符号具有相同的优先级,所以在除法运算的结果取模的时候注意使用括号!
加油吧,算法真的垃圾的要死