LA 3295 (计数 容斥原理) Counting Triangles
如果用容斥原理递推的办法,这道题确实和LA 3720 Highway很像。
看到大神们写的博客,什么乱搞啊,随便统计一下,这真的让小白很为难,于是我决定用比较严格的语言来写这篇题解。
整体思路很简单:m*n的方格,其格点是(m+1)*(n+1)的点阵,选三个点有C((m+1)*(n+1), 3)中情况,其中能构成三角形的不容易计算,所以计算它的反面:三个点不能构成三角形,即三点共线的情况。
三点共线的情况也可以再分为三类:
①三点在一条水平线上,共有m*C(n+1, 3)种情况。
②三点在一条竖直线上,共有n*C(m+1, 3)种情况。
③然后就是三点在斜线下的情况,由于是对称的,不妨先统计\左上到右下方向的直线,最后乘2即可。
首先是gcd(i, j) - 1的含义:这是起点为(0, 0)终点为(i, j)的所有三点共线的情况。
令dp(i, j)表示i*j大小的方格中 有一个点在右下角 的三点共线的情况,根据容斥原理有如下递推关系:
dp(i, j) = dp(i-1, j) + dp(i, j-1) - dp(i-1, j-1) + gcd(i, j) - 1
令sum(i, j)表示i*j大小的方格中\方向的三点共线情况,也可以类似地递推:
sum(i, j) = sum(i-1, j) + sum(i, j-1) - sum(i-1, j-1) + dp(i, j)
最终答案就是:C((m+1)*(n+1), 3) - m*C(n+1, 3) - n*C(m+1, 3) - sum(i, j) * 2
#include <cstdio>
typedef long long LL; const int maxn = ;
LL dp[maxn + ][maxn + ], sum[maxn + ][maxn + ]; int gcd(int a, int b) { return b == ? a : gcd(b, a%b); } LL C(LL n) { return (LL)n * (n-) / * (n-) / ; } int main()
{
for(int i = ; i <= maxn; i++)
for(int j = ; j <= maxn; j++)
dp[i][j] = dp[i-][j] + dp[i][j-] - dp[i-][j-] + gcd(i, j) - ;
for(int i = ; i <= maxn; i++)
for(int j = ; j <= maxn; j++)
sum[i][j] = dp[i][j] + sum[i][j-] + sum[i-][j] - sum[i-][j-]; int n, m, kase = ;
while(scanf("%d%d", &n, &m) == && n)
{
n++; m++;
printf("Case %d: %lld\n", ++kase, C(n*m) - C(n)*m - C(m)*n - sum[n-][m-] * );
} return ;
}
代码君
LA 3295 (计数 容斥原理) Counting Triangles的更多相关文章
- UVA 12075 - Counting Triangles(容斥原理计数)
题目链接:12075 - Counting Triangles 题意:求n * m矩形内,最多能组成几个三角形 这题和UVA 1393类似,把总情况扣去三点共线情况,那么问题转化为求三点共线的情况,对 ...
- hdu 1396 Counting Triangles(递推)
Counting Triangles Problem Description Given an equilateral triangle with n thelength of its side, p ...
- Counting Triangles(hd1396)
Counting Triangles Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- 洛谷 P1596 [USACO10OCT]湖计数Lake Counting
题目链接 https://www.luogu.org/problemnew/show/P1596 题目描述 Due to recent rains, water has pooled in vario ...
- 《算法导论》——计数排序Counting Sort
今天贴出的算法是计数排序Counting Sort.在经过一番挣扎之前,我很纠结,今天这个算法在一些scenarios,并不是最优的算法.最坏情况和最好情况下,时间复杂度差距很大. 代码Countin ...
- 洛谷——P1596 [USACO10OCT]湖计数Lake Counting
P1596 [USACO10OCT]湖计数Lake Counting 题目描述 Due to recent rains, water has pooled in various places in F ...
- 【题解】晋升者计数 Promotion Counting [USACO 17 JAN] [P3605]
[题解]晋升者计数 Promotion Counting [USACO 17 JAN] [P3605] 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训.!牛是可怕的管理者! [题目描 ...
- 【概率论】1-2:计数方法(Counting Methods)
title: [概率论]1-2:计数方法(Counting Methods) categories: Mathematic Probability keywords: Counting Methods ...
- Leetcode之动态规划(DP)专题-338. 比特位计数(Counting Bits)
Leetcode之动态规划(DP)专题-338. 比特位计数(Counting Bits) 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数 ...
随机推荐
- windows下编译ffmpeg
windows 编译ffmpeg 搞过很多次,每次总是磕磕碰碰,从头到尾不能一直顺利,浪费一些时间.终究起原因,都是当时记得,过段时间就忘了.好记性不如烂笔头,大好周末晚上,闲暇无事,记录最近一次编译 ...
- mac mysql安装
一.安装 1.下载软件包直接安装即可: http://rj.baidu.com/soft/detail/25675.html?ald 安装完成后root默认密码为空: 二.修改密码 直接修改密码会提示 ...
- Codeforces Round #347 (Div. 2) C. International Olympiad 找规律
题目链接: http://codeforces.com/contest/664/problem/C 题解: 这题最关键的规律在于一位的有1989-1998(9-8),两位的有1999-2098(99- ...
- 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
// test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...
- NYOJ-36 最长公共子序列 AC 分类: NYOJ 2014-01-03 20:54 155人阅读 评论(0) 收藏
#include<stdio.h> #include<string.h> #define N 1010 #define max(x,y) x>y?x:y int dp() ...
- failed creating the Direct3d device--debug
D3DDEVTYPE_REF 使用REF设备,用软件模拟Direct3D API 照理说是为了让电脑能跑本机不能硬件执行的渲染命令的 但我 pDeviceSettings->d3d9.Devic ...
- new Date()的数据类型的问题
function getServerNow(){ return new Date(new Date() + svrMinusLocal); } svrMinusLocal是服务器时间减本地时间的时间差 ...
- HTTP/2 对 Web 性能的影响(下)
一.前言 我们在 HTTP/2 对 Web 性能的影响(上)已经和大家分享了一些关于 Http2 的二项制帧.多用复路以及 APM 工具等,本文作为姊妹篇,主要从 http2 对 Web 性能的影响. ...
- Elasticsearch 学习~
http://cloud.51cto.com/art/201505/476322.htmEs https://www.gitbook.com/book/asdgh000/mongodb-elastic ...
- crontab 指定执行用户
linux下可以通过配置crontab来定时执行任务,执行体可以是一条系统命令或自己写的一个脚本,同时可以指派用户来执行.配置crontab有两种方法.方法1.使用crontab命令,例如添加一个新的 ...