BZOJ 3505 CQOI2014 数三角形 组合数学

题目大意:

给定一个m*n的方格。求上面有多少个格点三角形

m,n<=1000

枚举O(m^3*n^3)。铁定超时

我们选择补集法

首先我们随意选择三个不反复的点构成三角形 用组合数算出这一值 然后刨除三点一线的点就可以

枚举三点之中在两边的点的横纵坐标之差,中间点的位置数为GCD(x,y)-1,统计答案就可以

注意初始计算组合数时可能会爆int

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int m,n;
ll ans;
int GCD(int x,int y)
{
	if(!y)return x;
	return GCD(y,x%y);
}
int main()
{
	int i,j;
	cin>>m>>n;
	++m;++n;
	ans=m*n;
	ans=ans*(ans-1)*(ans-2)/6;
	for(i=0;i<=m;i++)
		for(j=0;j<=n;j++)
			if(i||j)
			{
				int gcd=GCD(i,j);
				ans-=(long long)(gcd-1)*(m-i)*(n-j)*(i&&j?2:1);
			}
	cout<<ans<<endl;
}
时间: 2025-01-19 22:45:07

BZOJ 3505 CQOI2014 数三角形 组合数学的相关文章

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

先n++, m++ 显然答案就是C(3, n*m) - m*C(3, n) - n*C(3, m) - cnt. 表示在全部点中选出3个的方案减去不合法的, 同一行/列的不合法方案很好求, 对角线的不合法方案cnt比较麻烦. 枚举对角线(左下-右上), 即(0, 0)-(x, y), 我们发现这种情况有(n-y)*(m-x)*2(算上左上-右下的)种, 然后中间有gcd(x, y)-1个点(不合法), 乘起来就好了. ---------------------------------------

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

3505: [Cqoi2014]数三角形 Time Limits: 1000 ms  Memory Limits: 524288 KB  Detailed Limits Description Input 输入一行,包含两个空格分隔的正整数m和n. Output 输出一个正整数,为所求三角形数量. Sample Input 输入1: 1 1 输入2: 2 2 Sample Output 输出1: 4 输出2: 76 Data Constraint 对于30%的数据 1<=m,n<=10 对于1

bzoj 3505: [Cqoi2014]数三角形

Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正整数m和n. Output 输出一个正整数,为所求三角形数量. solution 给的 n,m 是格子数,实际上点数是n+1,m+1,所以我们先++n,++m  下面说的n,m是点数 我一开始是想着总方案数是 C(n*m,3),然后减去 竖列,横行,对角线 长度len的 C(len,3)  但是我只考虑斜率

bzoj 3505 [Cqoi2014]数三角形——排列组合

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3505 好题!一定要经常回顾! 那个 一条斜线上的点的个数是其两端点横坐标之差和纵坐标之差的gcd-1 真是很妙. https://blog.csdn.net/u012288458/article/details/48624859 https://www.cnblogs.com/Var123/p/5377616.html 然而还可以递推?https://www.cnblogs.com/liu

bzoj 3505 [Cqoi2014]数三角形 容斥原理+数学

题面 题目传送门 解法 直接求三角形个数似乎并不好求 那么我们不妨考虑补集转化,即\(ans={nm\choose3}\)-三点共线的个数 三点共线分别为在行上,在列上,以及斜着的 斜着的只要枚举斜率是什么,然后就很好求了 代码 #include <bits/stdc++.h> #define int long long using namespace std; template <typename node> void read(node &x) { x = 0; int

3505: [Cqoi2014]数三角形

3505: [Cqoi2014]数三角形 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1324  Solved: 807[Submit][Status][Discuss] Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正整数m和n. Output 输出一个正整数,为所求三角形数量. Sample Inp

Luogu P3166 [CQOI2014]数三角形 组合数学

好题鸭.. 不好直接求三角形个数,那就用全集-补集,转化为求三点共线的数量. 具体求法是求出水平共线数量与竖直共线数量和斜线共线数量. 用排列组合的知识可知为水平和竖直的为$C_n^3$?与$C_m^3?$. 求斜线三点共线:显然,对于点$(a,b) (x,y)$连成的线段$(其中a>x,b>y)$,在它们中间有$gcd(a-x,b-y)-1$个整点,因此基本的思路就是枚举两个点,然后第3个点就是$gcd(a-x,b-y)-1$种可能了.我们又发现,这些线段是可以平移和对称(/和\)的,于是并

【BZOJ 3505】 [Cqoi2014]数三角形

3505: [Cqoi2014]数三角形 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 664 Solved: 403 [Submit][Status][Discuss] Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正整数m和n. Output 输出一个正整数,为所求三角形数量. Sample Inpu

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

[BZOJ3505][Cqoi2014]数三角形 Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正整数m和n. Output 输出一个正整数,为所求三角形数量. Sample Input 2 2 Sample Output 76 数据范围 1<=m,n<=1000 题解:显然要用补集法,我们只需要求出三点共线的方案数即可.方法是先枚举两端的点所形成的向