[BZOJ 3505][Cqoi2014]数三角形

本文通过使用容斥原理解决了一个关于平面中点的组合几何问题,避免了复杂的预处理,提供了一种简洁的解决方案。核心思路在于计算任意三点形成三角形的数量,然后减去共线点的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

\(\color{green}{solution}\)

容斥,任取3点后减去处于同一直线上的点即可
太懒了,不想预处理\(gcd\).

/**************************************************************
    Problem: 3505
    User: MiEcoku
    Language: C++
    Result: Accepted
    Time:352 ms
    Memory:1288 kb
****************************************************************/
 
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define C_3(x) (1LL * (x) * (x-1) * (x-2) / 6)
int gcd(int x, int y) {return x ? gcd(y%x, x) : y;}
int n, m;
ll ans;
 
int main() {
    scanf("%d%d", &n, &m); 
    ++ n; ++ m;
//  printf("%lld\n", C_3(n * m)); // de bug
    ans = C_3(n * m) - C_3(n) * m - C_3(m) * n;
//  printf("%lld\n", ans); // de bug
    for ( register int i = 1; i < n; ++ i) {
        for ( register int k = 1; k < m; ++ k) {
            ans -= 2LL * (gcd(i, k) - 1) * (n - i) * (m - k);
        }
    }
    printf("%lld\n", ans);
}

1365853-20181031102847974-1268638710.gif

转载于:https://www.cnblogs.com/miecoku/p/9881567.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值