本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

Description

给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个。下图为4x4的网格上的一个三角形。

注意三角形的三点不能共线。

Input

输入一行,包含两个空格分隔的正整数m和n。

Output

输出一个正整数,为所求三角形数量。

Sample Input

2 2

Sample Output

76

数据范围
1<=m,n<=1000

正解:组合数学

解题报告:

  这道题高一NOIP停课的时候考过原题...

  正难则反,无法直接求三角形的数量就可以考虑所有的方案减去不构成三角形的情况。

  显然只选出三个点的方案数为C((n+1)*(m+1),3),减去横着的:(m+1)*C(n+1,3),和竖着的:(n+1)*C(m+1,3)再减掉斜着的。斜着的计算起来比较复杂,考虑如果我只讨论经过左下角那个点(不妨设为原点)的情况,那么在我枚举了另一个端点(i,j)之后就可以唯一的确定一条直线,而这条直线上的点数可以用gcd(i,j)+1来表示,这个应该还比较好理解,就是得到一个直线解析式或者用相似来理解也行。只有在点数大于2的时候才会有贡献,且我们考虑这条直线可以平移,并且可以关于y轴对称后再平移,所以贡献就很明了了。

  即ans=$C ^ {3}_{(n+1)*(m+1)}$ $ -  (m+1)* C ^ {3}_{n+1}  -$ $(n+1)* C ^ {3}_{m+1}-$斜着的方案数

  斜着的方案数求法看代码吧......

    ps:我为了追求速度,预处理了两两的gcd,并且把组合数递推换成了直接暴力算。

 //It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
using namespace std;
typedef long long LL;
const int MAXN = ;
int n,m,G[MAXN][MAXN];
LL ans;
inline int gcd(int x,int y){ if(y==) return x; return gcd(y,x%y); }
inline int getint(){
int w=,q=; char c=getchar(); while((c<''||c>'') && c!='-') c=getchar();
if(c=='-') q=,c=getchar(); while (c>=''&&c<='') w=w*+c-'',c=getchar(); return q?-w:w;
} inline void work(){
n=getint(); m=getint(); n++; m++; if(n<m) swap(n,m); LL lim=n*m; int now;
ans=lim*(lim-)*(lim-)/; ans-=(LL)m*n*(n-)*(n-)/; ans-=(LL)n*m*(m-)*(m-)/;
for(int i=;i<n;i++) for(int j=i;j<n;j++) G[i][j]=gcd(i,j),G[j][i]=G[i][j];
for(int i=;i<n;i++)
for(int j=;j<m;j++) {
now=G[i][j]; now++;
if(now>) ans-=*(now-)*(n-i)*(m-j);
}
printf("%lld",ans);
} int main()
{
work();
return ;
}

BZOJ3505 [Cqoi2014]数三角形的更多相关文章

  1. [bzoj3505][CQOI2014]数三角形_组合数学

    数三角形 bzoj-3505 CQOI-2014 题目大意:给你一个n*m的网格图,问你从中选取三个点,能构成三角形的个数. 注释:$1\le n,m\le 1000$. 想法:本来是想着等中考完了之 ...

  2. BZOJ3505 CQOI2014数三角形(组合数学)

    显然可以用总方案数减掉三点共线的情况.对于三点共线,一个暴力的做法是枚举起点终点,其间整点数量即为横纵坐标差的gcd-1.这样显然会T,注意到起点终点所形成的线段在哪个位置是没有区别的,于是枚举线段算 ...

  3. [bzoj3505 Cqoi2014] 数三角形 (容斥+数学)

    传送门 Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正 ...

  4. bzoj3505: [Cqoi2014]数三角形 [数论][gcd]

    Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正整数m和 ...

  5. 【排列组合】bzoj3505 [Cqoi2014]数三角形

    http://blog.csdn.net/zhb1997/article/details/38474795 #include<cstdio> #include<algorithm&g ...

  6. 2018.09.09 bzoj3505: [Cqoi2014]数三角形(容斥原理+简单计数)

    传送门 正难则反. 可以直接把问题转化成求出三点共线的情况数量. 如果同在一排或一列显然可以直接算,关键是如何求出斜着的. 我们知道,对于一个整点矩形. 如果长为x,宽为y,那么这个矩形任意一条对角线 ...

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

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

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

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

  9. 【bzoj3505】[Cqoi2014]数三角形

    [bzoj3505][Cqoi2014]数三角形 2014年5月15日3,5230 Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4×4的网格上的一个三角 ...

随机推荐

  1. iframe大小自适应

    前几天,舍友去某互联网公司面前端研发工程师.回来后,他就跟我们聊了下面试官给他出的题.其中,有一道题是“如何实现iframe高度的自适应?”.好吧,我承认,我听到iframe这个词的第一反应就是:这个 ...

  2. ICompare接口、Sort()方法

    1.接口中的方法并不实现具体功能,继承于该接口的类必须实现具体功能. 核心思想:对修改封闭,对扩展开放. 2.Sort()方法: 默认:Sort(内容) 英文:按照首字母顺序排序,首字母相同则看第二个 ...

  3. winform(四)——简单计算器制作

    效果图: 代码区: using System; using System.Collections.Generic; using System.ComponentModel; using System. ...

  4. android 生成验证码图片

    (转自:http://blog.csdn.net/onlyonecoder/article/details/8231373) package com.nobeg.util; import java.u ...

  5. Ubuntu搭建Note.Js 平台

    1. 安装nodeJs和npm apt-get install nodejsapt-get install npm 2 .node有一个模块叫n,是专门用来管理node.js的版本的.首先安装n模块: ...

  6. 【转】What is an SDET

    What is an SDET? SDET stands for Software Development Engineer in Test (or Software Design Engineer ...

  7. 【java开发】分支语句、循环语句学习

    一.Java分支语句类型 if-else 语句 switch 关于if-esle语句可以拆分为三种 if语句 if(条件){语句块;} if-else语句if(条件语句){语句块;} if-else ...

  8. TJ2016 CTF Write up

    No zuo no die. Use markdown to write writeup in the future......

  9. 【2016-10-17】【坚持学习】【Day9】【反射】

    3个主要命名空间 System.Type System.Reflection System.Reflection.Assembly 2个主要类 System.Type System.Reflectio ...

  10. strus2验证框架

    为什么要用验证框架? 当验证规划比较复杂时,Action类的代码江边的非常繁琐,假如我们要对电话号码进行验证,是非常麻烦的. 验证框架的优点 Struts2中内置了一个验证框架,将常用的验证规则进行了 ...