数三角形(二)》-筛除法斜线结论

2024-08-25 16:28
文章标签 三角形 结论 斜线 筛除

本文主要是介绍数三角形(二)》-筛除法斜线结论,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

算法思路
1、一个直观的思路是筛除法,即:答案=总数-三点共线的种数
总数易求得,为组合数C((n+1)*(m+1),3),考虑到n、m数值范围,考虑用long long
2、三点共线的情况有:
(1)网格顶点同行,每行有m+1个顶点,共n+1行,共有:C(m+1,3) * (n+1)
(2)网格顶点同列,每列有n+1个顶点,共m+1列,共有:C(n+1,3) * (m+1)
(3)网格顶点同在斜线上,分斜向上和斜向下,显然两者方案数是一样的,下面考虑斜向下情况:

例如:n=5 m=7
(1)以行数为X、列数为Y的二维平面表示方格网络n*m,左上方格顶点为原点(0,0)。
(2)尝试从某网格顶点A朝斜向下方向的点B连斜线,不难总结出斜线结论:方格顶点A、B斜连线上有gcd(BC,AC)+1个点(BC、AC为A、B在X、Y轴的差,1≤AC≤m,1≤BC≤n)。
3、故而,对于斜向下的斜线,我们只需枚举两个方格顶点对(i,j):两者满足在X轴、Y轴上分别相差i、j,可取定两端顶点,再在其间取一点构成三点共线,共有方案数为gcd(i,j)-1。易知,每个(i,j)点对都有(n-i+1) * (m-j+1)种,枚举(i,j)复杂度为O(n2n2),gcd复杂度为O(n)。
4、如此,时间复杂度为O(n2n2lgn),考虑到n的规模,可AC。

#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
/*结论:对于二维n*m方格网,若AC//Y轴,BC//X轴,则斜线AB上有gcd(BC,AC)+1个方格顶点(1<=AC<=m 1<=BC<=n)。
对于斜线:可枚举X轴差为i、Y轴差j的两点,对该点对(i,j)取定两端点,则三点共线方案有gcd(i,j)-1,整个方格网有这样的点对(i,j)数为(n-i+1)*(m-j+1),故总方案数=sum{(n-i+1)*(m-j+1)*(gcd(i,j)-1)} (1<=i<=n, 1<=j<=m)
枚举时间复杂度为O(n^2),gcd(i,j)时间复杂度为lgn,总时间复杂度:O(n*nlgn)*/
const int N=3001;
typedef long long ll;
ll n,m,ans,sum;
ll calc(ll x){//计算组合数C(x,3)return x*(x-1)*(x-2)/6;
}int gcd(int x,int y){//最大公约数if(y==0) return x;return gcd(y,x%y);
}signed main(){cin>>n>>m;//n行m列ans=calc((n+1)*(m+1));//最多可构成三角形数(去掉任意三点共线的情况)ans-=(calc(n+1)*(m+1)+calc(m+1)*(n+1));//同列、同行三点共线种数for(int i=1;i<=n;i++)//枚举斜向下的斜线点对:(i,j)	for(int j=1;j<=m;j++)sum+=(n-i+1)*(m-j+1)*(gcd(i,j)-1);ans-=sum*2;cout<<ans;
}

这篇关于数三角形(二)》-筛除法斜线结论的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106060

相关文章

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

CSS实现DIV三角形

本文内容收集来自网络 #triangle-up {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;} #triangle-down {width: 0;height: 0;bor

【Godot4.3】多边形的斜线填充效果基础实现

概述 图案(Pattern)填充是一个非常常见的效果。其中又以斜线填充最为简单。本篇就探讨在Godot4.3中如何使用Geometry2D和CanvasItem的绘图函数实现斜线填充效果。 基础思路 Geometry2D类提供了多边形和多边形以及多边形与折线的布尔运算。按照自然的思路,多边形的斜线填充应该属于“多边形与折线的布尔运算”范畴。 第一个问题是如何获得斜线,这条斜线应该满足什么样

双指针(5)_单调性_有效三角形的个数

个人主页:C++忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创 双指针(5)_单调性_有效三角形的个数 收录于专栏【经典算法练习】 本专栏旨在分享学习C++的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. 题目链接: 2.题目描述 : 3.解法 :     解法一(暴力枚举) :     算法思路 :     代码展示 : 暴力枚

利用向量积(叉积)计算三角形的面积和多边形的面积(hdu2036)

开始撸计算几何题目了。。。。。。。 预备知识:叉乘求多边形面积 参考证明资料: 公式证明: http://www.cnblogs.com/xiexinxinlove/p/3708147.html 高中知识: http://wenku.baidu.com/view/867e6edfad51f01dc281f11a.html #include<stdio.h>#inclu

拼接三角形

/********************************************************************************* 问题描述: 牛牛手里有N根木棒,分别编号为1~N,现在他从N根里想取出三根木棒,使得三根木棒构成一个三角形,你能计算出牛牛有多少种取法吗?(考虑两种取法中使用的木棒编号有一个不一样就认为是不同的取法)。  输入描述: 首先输

OpenGL/GLUT实践:实现反弹运动的三角形动画与键盘控制(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 运行效果2 实验过程2.1 环境配置2.2 绘制三角形2.2.1 渲染函数2.2.2 主函数2.2.3 运行结果 2.3 调整窗口大小2.4 简单动画与按键控制2.4.1 简单旋转2.4.2 键盘控制 2.5 窗口反弹动画2.5.1 处理窗口大小变化2.5.2 渲染函数2.5.3 定时器2.5.4 控制速度

CSS详解:绘制三角形过程

前言 本文旨在用最简单的方式展示CSS border绘制三角形的各种方法,虽然用css 绘制三角形已经不是什么新鲜事了,不过,这篇文章将会尽力展示最全的三角形各种绘制方式。 附送一个三角形在线生成器 原理-盒子模型 如上图,这是一个盒子模型的结构,分为四个区域,content、padding、border, margin 。而本次示例主要用到的是盒子模型中的content和

★ 算法OJ题 ★ 力扣611 - 有效三角形的个数

Ciallo~(∠・ω< )⌒☆ ~ 今天,椎名日和将和大家一起做一道双指针算法题--有效三角形的个数~ 目录 一  题目 二  算法解析 三  编写算法 一  题目 二  算法解析 给三个数,判断是否能构成三角形的条件:两个较小的数相加大于第三个数。 解法⼀:暴力求解 算法思路:三层 for 循环枚举出所有的三元组,并且判断是否能构成三⻆形。(会超时)

MATLAB 计算三角形的外接圆心和半径(84)

MATLAB 计算三角形的外接圆心和半径(84) 一、算法介绍二、算法实现1.代码 一、算法介绍 计算三角形的外接圆心和半径,可视化显示结果 二、算法实现 1.代码 % 设置三个点的坐标A = [1, 1];B = [4,