P3166 [CQOI2014]数三角形
直接求还要考虑各种不合法情况,不好计数
很容易想到容斥
把所有可能减去不合法的情况剩下的就是合法情况
那么我们只要任取不同的三点就是所有可能,不合法情况就是三点共线
对于两点 $(x_1,y_1)\ ,\ (x_2,y_2)$ ,它们之间有 $gcd(\left | x_1-x_2 \right |,\left | y_1-y_2 \right |)-1$ 个交点
证明?因为第三点C如果在两点A,B间的线上
那么$\frac{\left | x_A-x_C \right |}{ \left | y_A-y_C \right |}=\frac{\left | x_A-x_B \right |}{ \left | y_A-y_B \right |}$
因为 $x_C,y_C$ 为整数且在A,B之间,所以只有 $gcd(\left | x_A-x_B \right |,\left | y_A-y_B \right |)-1$ 个位置可取
自己画个图感性理解一下就好了
所以一个直接的思路就是枚举所有两个点A,B,算出C的数量
但是可以发现有很多线段AB其实本质是一样的,只是位置不同,我们可以通过平移来得到
把点A固定在原点上,然后枚举B,这样可以得到所有本质不同的线段
然后考虑有多少种平移方案
设 B 坐标为 (X,Y),那么线段可以向上平移最多 N-Y 个单位,向右平移最多 M-X 个单位
因为可以平移 0 个单位,所以共有 (N-Y+1)(M-X+1) 种方案
因为AB斜率可以为负,所以要把之前求出来的方案数再乘 2
在坐标系中任选3点的方案数为 $C_{(N+1)(M+1)}^{3}$
别忘了减去三点横坐标相同或纵坐标相同的情况:
对于每条横线,都有 $C_{M+1}^{3}$种方案,共 N 条横线
对于每条纵线,也是一样,为 $M*C_{N+1}^{3}$
别忘了开 long long
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
int n,m,t;
ll ans;
int gcd(int a,int b) { return b ? gcd(b,a%b) : a; }
int main()
{
n=read()+; m=read()+;
t=n*m;
ans=1ll*t*(t-)*(t-)/(**) - 1ll* m* n*(n-)*(n-)/(**) - 1ll* n* m*(m-)*(m-)/(**);
//总方案数 - 纵线不合法方案 - 横线不合法方案
for(int i=;i<n;i++)//枚举点B纵坐标
for(int j=;j<m;j++)//横坐标
ans-=1ll*(n-i)*(m-j)*(gcd(i,j)-)*;//减去斜线不合法方案数
printf("%lld",ans);
return ;
}
P3166 [CQOI2014]数三角形的更多相关文章
- bzoj3505 / P3166 [CQOI2014]数三角形
P3166 [CQOI2014]数三角形 前置知识:某两个点$(x_{1},,y_{1}),(x_{2},y_{2})\quad (x_{1}<x_{2},y_{1}<y_{2})$所连成 ...
- BZOJ3505 & 洛谷P3166 [Cqoi2014]数三角形 【数学、数论】
题目 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. 输入格式 输入一行,包含两个空格分隔的正整数m和n. 输出格式 输出 ...
- 【题解】洛谷P3166 [CQOI2014] 数三角形(组合+枚举)
洛谷P3166:https://www.luogu.org/problemnew/show/P3166 思路 用组合数求出所有的3个点组合(包含不合法的) 把横竖的3个点共线的去掉 把斜的3个点共线的 ...
- 洛谷P3166 [CQOI2014]数三角形
题目描述 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形.注意三角形的三点不能共线. 输入输出格式 输入格式: 输入一行,包含两个空格分隔的正整数m和n ...
- Luogu P3166 [CQOI2014]数三角形 组合数学
好题鸭.. 不好直接求三角形个数,那就用全集-补集,转化为求三点共线的数量. 具体求法是求出水平共线数量与竖直共线数量和斜线共线数量. 用排列组合的知识可知为水平和竖直的为$C_n^3$与$C_m^ ...
- [CQOI2014]数三角形 题解(组合数学+容斥)
[CQOI2014]数三角形 题解(数论+容斥) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1328780 链接题目地址:洛谷P3166 BZOJ 350 ...
- BZOJ 3505: [Cqoi2014]数三角形 数学
3505: [Cqoi2014]数三角形 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- Bzoj 3505: [Cqoi2014]数三角形 数论
3505: [Cqoi2014]数三角形 Time Limits: 1000 ms Memory Limits: 524288 KB Detailed Limits Description
- bzoj 3505: [Cqoi2014]数三角形 组合数学
3505: [Cqoi2014]数三角形 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 478 Solved: 293[Submit][Status ...
随机推荐
- HBase入门基础教程 HBase之单机模式与伪分布式模式安装
在本篇文章中,我们将介绍Hbase的单机模式安装与伪分布式的安装方式,以及通过浏览器查看Hbase的用户界面.搭建HBase伪分布式环境的前提是我们已经搭建好了Hadoop完全分布式环境,搭建Hado ...
- MyBatis总结八:缓存介绍(一级缓存,二级缓存)
简介 为数据库的查询进行缓存,是减少数据库压力的主要途径.分为一级缓存和二级缓存. 一级缓存:session级别缓存,作用于当前会话. 二级缓存:SessionFactory级别缓存,作用于整个Ses ...
- 如何关闭打开了多个activity的activity
专门建立一个类,内部有一个静态的linklist对象,用来记录打开的activity,如果该ACTIVITY没有被打开过,在每一个activity oncreate方法中将自己的实例加入这个list. ...
- php中使用array_reduce给数组降维
PHP里面最强大的工具,就是数组,它融合了多种数据结构的特点,数组.队列.栈.哈希表等等,而且容器可以兼容各种类型,任意嵌套,简直无所不能.围绕着数组,PHP原生支持了一些列的函数,使得数组在实际编程 ...
- [luogu3379]最近公共祖先(树上倍增求LCA)
题意:求最近公共祖先. 解题关键:三种方法,1.st表 2.倍增法 3.tarjan 此次使用倍增模板(最好采用第一种,第二种纯粹是习惯) #include<cstdio> #includ ...
- uniqid() 函数 和 microtime()函数
uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID.语法 uniqid(prefix,more_entropy) 参数 描述prefix 可选.为 ID 规定前缀.如果 ...
- windows 7 系统装机优化
A:系统设置 1.控制面板\系统和安全\Windows Update\更改设置 把系统升级以及提示关闭 控制面板\系统和安全\Windows 防火墙\自定义设置 把专用网络和公共网络的防火 ...
- eclips git中的add to Index无效解决
今天在使用eclips git中的add to Index,发现其无效,具体如下 问题描述: 通过export导入一个git java项目 在java工程中新增一个类文件IndicatorCalcTe ...
- php学习笔记-do while循环
do{ func(); }while(condition) do while执行逻辑是先执行循环体里面的代码,再判断condition是否为true,如果是则和while循环一样了.如果conditi ...
- Luogu 3759 [TJOI2017]不勤劳的图书管理员
再也不作死写FhqTreap作内层树了,卡的不如暴力呜呜呜…… 题意翻译:给一个序列,每个下标包含两个属性$a$和$v$,求第一个属性与下标形成的所有逆序对的第二个属性和,给出$m$个交换两个下标的操 ...