放积木

发布时间 2023-09-19 15:27:21作者: shunn
  • 题意

题目链接: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;
}