ZOJ 3647(格点上的三角形数目)

这道题目说起来真的是忧伤啊,比赛一开始的时候就开始做做了一场也没有做出来~。

题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3647

题意: 就是在格点网络上数三角形。

思路:  思路就是先做一个C(3, n*m) 然再把三点共线的情况全部减掉。

关键就是如果找三点共线的情况, 最常规的思路是枚举矩形(也就是枚举三点中的两个点),然后找去对角线上有几个点(枚举第三个点),再来判这个小矩形在整个大矩形中最多出现多少次。

code:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define clr(x, y) memset(x, y, sizeof x)

using namespace std;

typedef long long LL;

const int maxn = 1005;

int n, m;

int gcd(int a, int b)
{
    int mid;
    while(b != 0)
    {
        mid = a;
        a = b;
        b = mid % b;
    }
    return a;
}

LL cal(int _n)
{
    if (_n < 3) return 0;
    return (LL)_n * (_n - 1) * (_n - 2) / 6;
}

int main()
{
    while(scanf("%d%d", &n, &m) == 2)
    {

        LL ans = cal((n + 1) * (m + 1)) - cal(n + 1) * (m + 1) - cal(m + 1) * (n + 1);

        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                ans -= (LL)(gcd(i, j) - 1) * (n - i + 1) * (m - j + 1) * 2;
            }
        }

        printf("%lld\n", ans);
    }
    return 0;
}

还有一种思路就是dp

dp[n][m] 表示n*m的矩形里面的三角形的个数,然后用容斥定理找其与dp[n-1][m] dp[n][m-1] dp[n-1][m-1] 之间的关系,具体的我还没有去写,找时间补上。

时间: 2024-10-26 03:28:44

ZOJ 3647(格点上的三角形数目)的相关文章

判点在直线上,三角形内

判断点在直线上,需要满足两个条件,如判断Q点是否在线段p1p2上 1:(Q-P1)X(P2-P1)=0://叉乘为0 2:Q在以P1,P2为对角顶点的矩形内//保证点Q不在线段P1P2的延长线或反向延长线上 判断点在三角形内: 如果点P在三角形内,那么Spab+Spac+Spbc=Sabc 三角形面积公式由叉积给出 S=1/2×|crossProduct(a,b,c)|: 这种方法有浮点误差 另一种是沿三角形的边顺时针方向,判断P点是否在每条边的右边,如果是,就在三角形内 此法没有浮点误差 下面

均匀格点与对数格点上的Numerov方法

摘要 本文在两种数值格点(均匀格点和对数格点)上推导了Numerov方法的递推方程, 给出了简单的Python实现. 背景 Numerov方法是数值求解常微分方程(ODE)的一种方法, 适用于不含一阶项的二阶ODE $$begin{equation}y'' + f(r)y = s(r).end{equation}label{eq:numerov-ode}$$ 在物理上有很多方程满足这种形式, 其中与我最为相关的是薛定谔方程(SE), 更确切的是三维有心势下的径向薛定谔方程(rSE). 原子单位下

ZOJ 3647 Gao the Grid dp,思路,格中取同一行的三点,经典 难度:3

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4837 三角形的总数=格子中任取3个点的组合数-同一横行任取3个点数目-同一纵行任取3个点数目-同一斜直线上任取3个点数目 同一横行和同一纵行都好求 同一斜行的距离最远的点必然是一个矩形的两个端点,设矩形的长宽为l,w,中间可以取的点数则是(gcd(l,w)-1),左上角或左下角的起点反而不重要. 能够取到该矩形的可能是 (n-l+1)*(m-w+1),因为左上角作为起点或左下

zoj 3647 智商题

此题就是求格点中三角形的个数. 就是找出三点不共线的个数. n*m的矩形中有(n+1)*(m+1)个格点. 选出三个点的总个数为:C((n+1)*(m+1),3). 减掉共线的情况就是答案了. 首先是水平和垂直共线的情况:C(n+1,3)*(m+1)+C(m+1,3)*(n+1); 然后斜的共线的情况就是枚举矩形. 斜着共线的三点用枚举法n*m的矩形,对角两个点中间共有gcd(m,n)-1个点,两条对角线,所以数量*2,大矩形里共有(N-n+1)*(M-m+1)个的矩形,一并去除 1 #incl

ZOJ 3647 Gao the Grid(居然是暴力)

A n * m grid as follow: Count the number of triangles, three of whose vertice must be grid-points. Note that the three vertice of the triangle must not be in a line(the right picture is not a triangle). Input The input consists of several cases. Each

Lining Up(在一条直线上的最大点数目,暴力)

Lining Up Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1274    Accepted Submission(s): 366 Problem Description ``How am I ever going to solve this problem?" said the pilot.  Indeed, the pilo

二维有限格点上的随机行走

对于一个10x10的网格,从网格的中心出发,向四个方向行进的概率都是1/4,如果行走过程中遇到边界(撞到墙了),那么拒绝这一步行走.那么最终得到的分布是不是均匀分布呢?从结果上来最终得到的是均匀分布.我们可以用Metroplis抽样来解释.首先抽样过程中满足细致平衡,因为我们在撞墙的时候进行了REJECT,算法中隐含的Markov转移矩阵显然也是各态遍历的,所以最终得到均匀分布并不奇怪. % random_walk bounded 001 % 2 dimensional random walk

zoj 3647 Gao the Grid

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4837 先求出从所有点随机找出三个点的组合数,然后去掉共线的,平行好去掉,斜线就需要枚举矩形,也就是枚举两个端点形成向量. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 1000 5 #define ll long long 6 using

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

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