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]数三角形——组合数的更多相关文章

  1. BZOJ 3505: [Cqoi2014]数三角形( 组合数 )

    先n++, m++ 显然答案就是C(3, n*m) - m*C(3, n) - n*C(3, m) - cnt. 表示在全部点中选出3个的方案减去不合法的, 同一行/列的不合法方案很好求, 对角线的不 ...

  2. 【BZOJ3505】[Cqoi2014]数三角形 组合数

    [BZOJ3505][Cqoi2014]数三角形 Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. ...

  3. [CQOI2014]数三角形 组合数 + 容斥 + gcd

    推导过程 : 组合数+容斥原理+gcd 正确做法是暴力的一种优化,ans=所有情况 - 平行坐标轴的三点共线 - 斜线三点共线 如果快速求斜线三点共线: 首先要知道一个结论,对于点(a,b) (x,y ...

  4. bzoj3505 [Cqoi2014]数三角形——组合数+容斥

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3505 好题啊好题...好像还曾经出现在什么智力测试卷中来着...当时不会现在还是无法自己推出 ...

  5. [CQOI2014]数三角形 题解(组合数学+容斥)

    [CQOI2014]数三角形 题解(数论+容斥) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1328780 链接题目地址:洛谷P3166 BZOJ 350 ...

  6. BZOJ 3505: [Cqoi2014]数三角形 数学

    3505: [Cqoi2014]数三角形 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  7. Bzoj 3505: [Cqoi2014]数三角形 数论

    3505: [Cqoi2014]数三角形 Time Limits: 1000 ms  Memory Limits: 524288 KB  Detailed Limits   Description

  8. bzoj 3505: [Cqoi2014]数三角形 组合数学

    3505: [Cqoi2014]数三角形 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 478  Solved: 293[Submit][Status ...

  9. 3505: [Cqoi2014]数三角形

    3505: [Cqoi2014]数三角形 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1324  Solved: 807[Submit][Statu ...

随机推荐

  1. Flask-sqlalchemy 语法总结

    Flask-sqlalchemy 语法总结 ** DDLdb.create_all() :创建实体表db.drop_all(): 删除表 1)插入表Db.session.add(user) #user ...

  2. Redis哨兵模式(sentinel)学习总结及部署记录(主从复制、读写分离、主从切换)

    Redis的集群方案大致有三种:1)redis cluster集群方案:2)master/slave主从方案:3)哨兵模式来进行主从替换以及故障恢复. 一.sentinel哨兵模式介绍Sentinel ...

  3. 作用域&作用域链和with,catch语句&闭包

    作用域(函数) 作用域:变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期; 在一些类C编程语言中花括号内的每一段代码都有各自的作用域,而且变量在声明它们的代码段外是不可见的,称之为块 ...

  4. 第三周作业————————word count

    #include <stdio.h> void main() { FILE *fp; , str, word, pu, ch; int g; str = ; word = ; pu = ; ...

  5. 《Linux内核分析》实践2

    <Linux及安全>实践2 一.Linux基本内核模块 1.1什么是内核模块 linux模块是一些可以作为独立程序来编译的函数和数据类型的集合.之所以提供模块机制,是因为Linux本身是一 ...

  6. 一些调格式的经验 & 插入图注和尾注

    一些调格式的经验(以Word2010为例) 1. 从目录正文分别编页码 将光标放在要重新编写页码起始页的最开始位置 分节:页面布局->分隔符->分节符(连续) 插入页码后,选中页码起始页页 ...

  7. linux内核分析第六周学习笔记

    LINUX内核分析第六周学习总结 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.c ...

  8. Ajax写成绩批量录入

    1.jsp,ajax的循环调用,必须要递归,否则会出错. <%@ page language="java" import="java.util.*" pa ...

  9. junit-test

    一.题目简介: 用单元测试junit4测试calculator类的加减乘除四种方法,来初步学习junit4的学习方法. 二.源码的github链接  :https://github.com/weare ...

  10. git工具

    1.Git Bash常用命令: pwd    当前工作目录 clear   清屏 ls   列举当前目录下的文件及文件夹 cd 更改目录 mkdir   创建目录 touch   创建空文件 cp 拷 ...