博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【CQOI2014】数三角形
阅读量:4542 次
发布时间:2019-06-08

本文共 1313 字,大约阅读时间需要 4 分钟。

题解

考虑使用总数减去不合法的数量

首先将\(n, m\)都加上\(1\),将网格变成坐标系

总数即为\(\large\binom{n\times m}{3}\)

不合法的有三种情况:

  • 三个点在同一行上。每一行有\(\binom{m}{3}\)种不合法的情况,有\(n\)行,总数\(n\cdot\binom m3\)

  • 三个点在同一列上。每一列有\(\binom n3\)种不合法的情况,有\(m\)行,总数\(m\cdot\binom n3\)

  • 三个点在同一条斜线上

    如果斜率为正,那么将一个点移动到原点,然后枚举另外一个点,这样的直线有

    \((n - i)(m - j)\)

    然后斜率可能为负,\(\times 2\)即可

    于是总数就是\(2\sum\limits_{i=1}^{n-1}\sum\limits_{j=1}^{m-1}(\gcd(i,j)-1)(n-i)(m-j)\)

于是答案为

\[ \binom{n\times m}3 - n\binom m3 - m\binom n3 - 2\sum_{i=1}^{n-1}\sum_{j=1}^{m-1}(\gcd(i,j) - 1)(n - i)(m - j) \]

代码

结论题的代码就是好打

#include
#include
#include
#include
#define RG registerinline int read(){ int data = 0, w = 1; char ch = getchar(); while(ch != '-' && (!isdigit(ch))) ch = getchar(); if(ch == '-') w = -1, ch = getchar(); while(isdigit(ch)) data = data * 10 + (ch ^ 48), ch = getchar(); return data * w;}inline long long C(int x) { return 1ll * x * (x - 1) * (x - 2) / 6; }long long ans; int n, m;int main(){ n = read() + 1, m = read() + 1; ans = C(n * m) - n * C(m) - m * C(n); for(RG int i = 1; i < n; i++) for(RG int j = 1; j < m; j++) ans -= 2ll * (std::__gcd(i, j) - 1) * (n - i) * (m - j); printf("%lld\n", ans); return 0;}

转载于:https://www.cnblogs.com/cj-xxz/p/10370068.html

你可能感兴趣的文章
awk多模式匹配
查看>>
线段树
查看>>
a span等行内元素加margin属性后无效果解决方案
查看>>
傻瓜式硬盘重装win7系统图文加视频教程
查看>>
BZOJ 1607 [Usaco2008 Dec]Patting Heads 轻拍牛头:统计 + 筛法【调和级数】
查看>>
如果一个人请优雅的活着。
查看>>
验证码
查看>>
Django缓存配置
查看>>
Ubuntu下安装 Mysql
查看>>
LeetCode--Reverse Integer
查看>>
PHP_APC+Ajax实现的监视进度条的文件上传
查看>>
ZOJ2833*(并查集)
查看>>
外连接简要总结
查看>>
第一次作业-准备篇
查看>>
【C++】继承时构造函数和析构函数
查看>>
opencv源代码之中的一个:cvboost.cpp
查看>>
swift
查看>>
pycharm 快捷键
查看>>
Linux常用命令
查看>>
.net中的设计模式---单例模式
查看>>