-
题意
题目链接:https://codeforces.com/group/L9GOcnr1dm/contest/472110/problem/A
给一块积木,a x b,问有多少种摆放方式。(积木必须能放到底盘上)
-
思路
第一个坑,a x b,a 和 b 表示的是格子数,但是不是边长,比如说一条绳子,上面有4个节点,所以这条绳子的边长就为3。所以在一开始需要把 a 和 b 都减 1。
接下来就用那个格点矩形,就是说一个矩形确定了三个点,那么第四个点也就确定了。
然后就是枚举左边那个三角形的边长,先确定左边的三角形,然后再根据相似三角形确定右边的三角形。如果左边和右边都存在,那么这就是一种放法,答案加一。
这里还有一个点,很显然如果这个积木不是正方形,那么他就不是对称的,所以答案总数应该 x 2。
-
代码
#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
#include<math.h>
#include<stack>
#include<map>
#include<list>
#include<unordered_set>
#include<unordered_map>
#define endl '\n';
//#define int long long;
using namespace std;
typedef long long ll;
const int N = 2e5+10;
ll n, m, k, ans;
void sovle(){
cin >> n >> m;
n --, m --;
if (n > m)swap(n, m);
for (ll i = 0; i < n; i ++){
ll y = sqrt(n * n - i * i);
//cout << y << endl;
if (y * y + i * i == n * n){
if ((i * m) % n == 0 && (y * m) % n == 0){
ans ++;
//cout << i << ' ' << y << endl;
}
}
}
if (n != m){
ans *= 2;
}
cout << ans << endl;
}
int main()
{
int t = 1;
//scanf("%d", &t);
while (t --){
sovle();
}
return 0;
}