【BZOJ 3505】 [Cqoi2014]数三角形 容斥原理+排列组合+GCD

我们先把所有三角形用排列组合算出来,再把一行一列上的三点共线减去,然后我们只观察向右上的三点共线,向左上的乘二即可,我们发现我们如果枚举所有的两边点再乘中间点的个数(GCD),那么我们发现所有的两边点都会形成一个矩形对角线,而且他们的形状一定则贡献一定那么我们可以枚举形状来求贡献和。

#include <cstdio>
typedef long long LL;
LL n,m,ans,N,M;
LL GCD(LL x,LL y){
  return x==0?y:GCD(y%x,x);
}
int main(){
  scanf("%lld%lld",&n,&m);
  N=n+1,M=m+1;
  LL temp=N*M;
  ans=temp*(temp-1)*(temp-2)/6LL;
  ans-=N*M*(M-1)*(M-2)/6LL;
  ans-=M*N*(N-1)*(N-2)/6LL;
  for(LL i=1;i<=n;i++)
    for(LL j=1;j<=m;j++){
      LL x=GCD(i,j)-1;
      ans-=(n-i+1)*(m-j+1)*x*2;
    }
  printf("%lld",ans);
}
时间: 2024-11-03 21:37:41

【BZOJ 3505】 [Cqoi2014]数三角形 容斥原理+排列组合+GCD的相关文章

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

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]数三角形——排列组合

题目: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 数三角形 组合数学

题目大意: 给定一个m*n的方格.求上面有多少个格点三角形 m,n<=1000 枚举O(m^3*n^3).铁定超时 我们选择补集法 首先我们随意选择三个不反复的点构成三角形 用组合数算出这一值 然后刨除三点一线的点就可以 枚举三点之中在两边的点的横纵坐标之差,中间点的位置数为GCD(x,y)-1,统计答案就可以 注意初始计算组合数时可能会爆int #include<cstdio> #include<cstring> #include<iostream> #incl

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)  但是我只考虑斜率

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

【bzoj3505】[Cqoi2014]数三角形 容斥原理

题目描述 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. 输入 输入一行,包含两个空格分隔的正整数m和n. 输出 输出一个正整数,为所求三角形数量. 样例输入 2 2 样例输出 76 题解 容斥原理 三角形数目=选出三个点的方案数-三点共线的方案数. 选出三个点的方案数显然为$C_{(n+1)(m+1)}^3$. 三线共线的方案数,考虑枚举两端点,统计出一个矩形内的方案数,再算出总体方案数.其中点坐标的gcd-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