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 的数 ...
随机推荐
- input框中value与placeholder的区别
value:是input中预先放置的文字,当鼠标点击之后依然存在,是值的一部分. placeholder:是input中输入位置的默认显示的文字,鼠标点击后仍旧显示,但不属于值,类似于背景.
- SOLID architecture principles using simple C# examples
转:http://www.codeproject.com/Articles/703634/SOLID-architecture-principles-using-simple-Csharp?msg=4 ...
- UVA 12382 Grid of Lamps 贪心
题目链接: C - Grid of Lamps Time Limit:1000MSMemory Limit: 0KB 问题描述 We have a grid of lamps. Some of the ...
- EXT4.2--Ext Designer 使用
前言: “画EXT”是一个美好的想法,如果有一款可视化工具能够只需进行拖拽而设计EXT,生成代码--那真是一件美丽的事.然而现实是,即使是为Eclipse装上EXT插件,用上idea,手写代码的提示也 ...
- ZedGrap控件绘制图表曲线
问题描述: 使用C#中ZedGrap控件绘制图表曲线图 ZedGrap 介绍说明: 安装ZedGrap控件 ZedGraph控件dll文件: 添加ZedGraph控件,首先在新建立的C#图像工 ...
- 【BZOJ】【1965】SHUFFLE 洗牌
扩展欧几里德+快速幂 每次转换位置:第x位的转移到2*x %(n+1)这个位置上 那么m次后就到了(2^m)*x %(n+1)这个位置上 那么找洗牌m次后在 l 位置上的牌就相当于解线性模方程: (2 ...
- oracle——DDL
一.一些概念 定义: 主键--唯一标识一条记录,不能有重复的,不允许为空 外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值 索引--该字段没有重复值,但可以有一个空值 作用: 主键-- ...
- Linux操作系统下软件的安装方法大全
一.rpm包安装方式步骤: 1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录: 2.打开一个终端,su -成root用户: 3.cd soft.version.rpm所在 ...
- hdu 1056
水题 ~~ 按题目要求直接判断~. /************************************************************************* > A ...
- 数组对象Vector用法
import java.util.Vector; public class VectorTesting { public static void main(String[] args) { Vecto ...