洛谷 P3166 [CQOI2014]数三角形 BZOJ 3505 [Cqoi2014]数三角形
洛谷 P3166 [CQOI2014]数三角形
BZOJ 3505 [Cqoi2014]数三角形
题目链接:洛谷 P3166 [CQOI2014]数三角形 BZOJ 3505 [Cqoi2014]数三角形
算法标签: 组合数学
、最大公约数
题目
题目描述
给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个。下图为4x4的网格上的一个三角形。
注意三角形的三点不能共线。
输入格式
输入一行,包含两个空格分隔的正整数m和n。
输出格式
输出一个正整数,为所求三角形数量。
输入输出样例
输入 #1
2 2
输出 #1
76
说明/提示
数据范围
bzoj上是1<=m,n<=1000
题解:
组合数学
首先对于这道题的读入,n和m是从0开始计算的,为了方便处理,不妨将n与m都++。
我们可以先考虑去枚举每一个三角形,很显然是做不到的。
那么我们可以换一种思路,我们可以确定的是每一个三角形一定有三个点,并且这三个点不共线。
对于一定有三个点,很显然我们可以得到总答案:$ans~=~C_{n*m}^{3}$
那么对于三点不共线,我们现在就要考虑以下的情况:
1.三点不共横线:很显然,我们枚举每一条横边,在上边任选三个点,这样的三个点都是不合法的,又因为有n条横边,所以$ans~-=~n \times C_{m}^{3}$
2.三点不共竖线:同上,枚举每一条竖边,任选三点除去,所以$ans~-=~m \times C_{n}^{3}$
3.三点不过斜线:如何判断斜线,这就是这道题的难点所在,分析后我们可以发现一个问题,对于一个$(x \times y)$的网格矩形,从最左上角点到最右下角点的直线会经过$gcd(x,y)-1$个格点(不包含起点和中点),同理从最右上角点到最左下角点也会经过$gcd(x, y)-1$个格点,那么我们只需要枚举所有的矩形,删去这些情况即可:$ans~-=~(n-i)(m-j)(gcd(i,j)-1)*2$
最终得到的ans就是答案。
!!!注意:这道题的数据需要开$long long$
AC代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, m, ans;
ll gcd(ll a,ll b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
int main()
{
scanf("%lld%lld", &m ,&n);
n ++ ;
m ++ ;
ans = (n * m) * (n * m - 1) * (n * m - 2) / (1 * 2 * 3);
ans -= n * m * (m - 1) * (m - 2) / (1 * 2 * 3);
ans -= m * n * (n - 1) * (n - 2) / (1 * 2 * 3);
for (ll i = 2; i < n; i ++ )
for (ll j = 2; j < m; j ++ )
{
ans -= (n - i) * (m - j) * (gcd(i, j) - 1) * 2;
}
printf("%lld\n", ans);
return 0;
}
原文地址:https://www.cnblogs.com/littleseven777/p/11841296.html
- 点击块,让小块动起来 - 函数封装
- 玩玩文本挖掘-wordcloud、主题模型与文本分类
- Typecho 前台 getshell 漏洞分析
- 关于其他选择器以及选择器优先级详解
- 2016.05 第二周 群问题分享
- MyFlash——美团点评的开源MySQL闪回工具
- R语言关联规则可视化:扩展包arulesViz的介绍
- JS设置标签的内容和样式
- 大圣魔方——美团点评酒旅BI报表工具平台开发实践
- 详析获取标签
- 深度学习及AR在移动端打车场景下的应用
- R案例操作:RQDA和tm包结合进行文本挖掘
- 用Vue.js开发微信小程序:开源框架mpvue解析
- 分类模型的性能评估——以SAS Logistic回归为例: 混淆矩阵
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python数据科学:线性回归
- 人生苦短,我用k8s--------------单节点二进制部署
- 人生苦短,我用k8s--------------k8s集群二进制部署
- 从零开始学习 JD Chain(四)-使用穿透式检索-Release
- 用Python清除文件夹中的重复视频
- Python数据科学:线性回归诊断
- 用Python自动化生成倒计时图片
- (译)SDL编程入门(12)色彩调制
- (译)SDL编程入门(11)裁剪渲染和精灵表
- Python数据科学:正则化方法
- libVLC教程
- (译)SDL编程入门(10)Color Key
- Cocos2d-x初学者教程
- Python数据可视化:啥是佩奇
- 人物社交网络分析—平凡的世界