[Cqoi2014]数三角形——组合数
Description:
给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个。下图为4x4的网格上的一个三角形。
注意三角形的三点不能共线。
Hint:
1<=m,n<=1000
Solution:
直接算三角形肯定算死。
所以,先考虑所有的可能三角形。再减去不合法的三点共线的情况。
所有三角形:C((n+1)*(m+1),3)
不合法的情况怎么处理??
开始的想法:
1.找所有的两端在坐标轴上的直线,算出来整点数:gcd(x,y)+1;再算上下,左右的直线。
但是发现可能有的不合法直线不过边框的整点!!bug
2.考虑直线的方程:ax+by+c=0
a,b,c是常整数。并且都在1~n(m)的范围内。
相当于求x,y的非负整数解的个数。(exgcd)
但是待定系数n^4,枚举系数n^3都不行。bug
正解:
优化一下
发现找直线非常复杂。
如果我们找线段呢?并且保证线段的两端都在整点上?相当于把直线根据整点拆开了
(a,b)(c,d)的线段中间的整点有gcd(abs(c-a),abs(d-b))-1个方案。
枚举线段减去中间放点的方案,这样还是n^4
发现,许多的线段本质上是一致的,只是平移了。
所以,我们只需要枚举所有的(0,0)(x,y),就可以了、。
平移的方案就是(n+1-x)*(m+1-y)相当于画出了一个矩形。
对于不是在坐标轴上的点,我们还要乘2,相当于上下一个对称情况。
Code:
#include<cstdio>
#define LL long long
int gcd[][];
int n,m;
LL t,ans;
inline int getgcd(int a,int b)
{
if (gcd[a][b])return gcd[a][b];
if (!a)return gcd[a][b]=b;
if (!b)return gcd[a][b]=a;
return gcd[a][b]=getgcd(b,a%b);
}
inline void calc()
{
for(int i=;i<=m;i++)gcd[][i]=i;
for(int i=;i<=n;i++)gcd[i][]=i;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
getgcd(i,j);
}
int main()
{
scanf("%d%d",&n,&m);
calc();
t=(n+)*(m+);
ans=t*(t-)*(t-)/;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
if (i||j)
{
if (!i||!j)ans-=(LL)(gcd[i][j]-)*(n-i+)*(m-j+);
else ans-=(LL)*(gcd[i][j]-)*(n-i+)*(m-j+);
}
printf("%lld",ans);
}
[Cqoi2014]数三角形——组合数的更多相关文章
- BZOJ 3505: [Cqoi2014]数三角形( 组合数 )
先n++, m++ 显然答案就是C(3, n*m) - m*C(3, n) - n*C(3, m) - cnt. 表示在全部点中选出3个的方案减去不合法的, 同一行/列的不合法方案很好求, 对角线的不 ...
- 【BZOJ3505】[Cqoi2014]数三角形 组合数
[BZOJ3505][Cqoi2014]数三角形 Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. ...
- [CQOI2014]数三角形 组合数 + 容斥 + gcd
推导过程 : 组合数+容斥原理+gcd 正确做法是暴力的一种优化,ans=所有情况 - 平行坐标轴的三点共线 - 斜线三点共线 如果快速求斜线三点共线: 首先要知道一个结论,对于点(a,b) (x,y ...
- bzoj3505 [Cqoi2014]数三角形——组合数+容斥
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3505 好题啊好题...好像还曾经出现在什么智力测试卷中来着...当时不会现在还是无法自己推出 ...
- [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 ...
- 3505: [Cqoi2014]数三角形
3505: [Cqoi2014]数三角形 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1324 Solved: 807[Submit][Statu ...
随机推荐
- 《DISTRIBUTED SYSTEMS Concepts and Design》读书笔记 一
第二章 系统模型 描述分布式系统的三种模型 Physical models : 用机器,网络,硬件等语言去描述整个系统. Architectural models : 用计算.计算任务.计算单元等语言 ...
- java使用何种类型表示精确的小数?
问题 java使用何种类型表示精确的小数? 结论 float和double类型的主要设计目标是为了科学计算和工程计算,速度快,存在精度丢失 BigDecimal用来表示任意精确浮点数运算的类,在商业应 ...
- libc.so.6: version 'GLIBC_2.14' not found报错提示的解决方案
线上一台服务器在执行leveldb程序的时候,报错:"libc.so.6: version `GLIBC_2.14' not found". 排查原因及解决方法如下: 1)产生原因 ...
- 分布式监控系统Zabbix-批量添加聚合图形
之前部署了Zabbix(3.4.4版本)监控环境,由于主机比较多,分的主机组也比较多,添加聚合图形比较麻烦,故采用python脚本进行批量添加聚合图形.脚本下载地址:https://pan.baidu ...
- 理解Vue 2.5的Diff算法
DOM"天生就慢",所以前端各大框架都提供了对DOM操作进行优化的办法,Angular中的是脏值检查,React首先提出了Virtual Dom,Vue2.0也加入了Virtual ...
- Safecracker-HDU1015
题意 给你大写字母的字符串,A=1,...Z=26,以及target 问你是否有v - w^2 + x^3 - y^4 + z^5 = target 有输出字典序大的那个字符串 分析 dfs code ...
- Finished yeah!
终于到了最后的博客阶段,这时候才知道博客此时此刻是多么的惬意,它成了书写心声的自由平台!耗时一天完成这作业说起来也是蛮辛苦的,编译器需要新装,IDE需要熟悉,当然最主要的是之前浅入浅出的C++功底在此 ...
- 我的github地址
链接:https://github.com/long0123/test.git 推送项目的github的大致步骤如下: 1.在本地创建一个项目仓库,可以放些基本的项目文件 2.cd至该目录下 3. ...
- MyBatis自动生成Java/C#的Bean(Entity)的等价MYSQL实现函数
这是单元测试代码:TESTTITLECASE.sql SELECT TITLECASE('ABC_DEF_hgk') as BEANNAME FROM DUAL; SELECT TITLECASE(' ...
- Oracle 数据表误删恢复 Flashback
1. 前提条件. recyclebin 参数打开. 验证参数是否打开: SHOW PARAMETER RECYCLEBIN 2. 如果参数没有打开的话 需要打开,并且重启一下数据库方法为 alter ...