Gym - 101845E (图形转换思维)

题意:给你个边长为n(1 <= n <= 50)的下图这种三角形,图形所有点构成集合。找多少对a,b满足条件,条件为:ab两点之间还有其他点。

 

 题解:刚开始以为直接找规律就行,wa了两次发现可能会有斜着的。后来又想暴力跑一下就行了,但是坐标是double的怎么跑?然后发现转化成直的就行了。至于为什么想成这种,也说不清,这样画出来发现他们的性质确实一样,以后看见这图形记住好点,这种性质一个样。

然后枚举每两个点,求坐标差的gcd,如果大于1,则满足。这个为什么呢?在纸上画一下就知道,gcd表示的是以ab为顶点的线段可以被整分为gcd份。因为我们所有书都是整数。

 

 

#include <bits/stdc++.h>
#define FOR(a, b, c) for(int a = b; a <= c; a++)
#define met(a, b) memset(a, b, sizeof(a))
#define mp make_pair
using namespace std;
typedef long long ll;
vector<pair<int, int> >q;
int main(){
    int n; cin >> n;
    for(int i = 0; i <= n; i++){
        for(int j = 0; j <= i; j++){
            q.push_back(mp(i, j));
        }
    }
    int tot = 0;
    for(int i = 0; i < q.size(); i++){
        for(int j = i+1; j < q.size(); j++){
            int x = abs(q[i].first - q[j].first);
            int y = abs(q[i].second - q[j].second);
            if(__gcd(x, y) > 1) tot++;
        }
    }
    cout << tot << endl;
    return 0;
}

 

posted @ 2019-08-30 19:54  philo_zhou  阅读(240)  评论(0编辑  收藏  举报