如果用容斥原理递推的办法,这道题确实和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的更多相关文章

  1. UVA 12075 - Counting Triangles(容斥原理计数)

    题目链接:12075 - Counting Triangles 题意:求n * m矩形内,最多能组成几个三角形 这题和UVA 1393类似,把总情况扣去三点共线情况,那么问题转化为求三点共线的情况,对 ...

  2. hdu 1396 Counting Triangles(递推)

    Counting Triangles Problem Description Given an equilateral triangle with n thelength of its side, p ...

  3. Counting Triangles(hd1396)

    Counting Triangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  4. 洛谷 P1596 [USACO10OCT]湖计数Lake Counting

    题目链接 https://www.luogu.org/problemnew/show/P1596 题目描述 Due to recent rains, water has pooled in vario ...

  5. 《算法导论》——计数排序Counting Sort

    今天贴出的算法是计数排序Counting Sort.在经过一番挣扎之前,我很纠结,今天这个算法在一些scenarios,并不是最优的算法.最坏情况和最好情况下,时间复杂度差距很大. 代码Countin ...

  6. 洛谷——P1596 [USACO10OCT]湖计数Lake Counting

    P1596 [USACO10OCT]湖计数Lake Counting 题目描述 Due to recent rains, water has pooled in various places in F ...

  7. 【题解】晋升者计数 Promotion Counting [USACO 17 JAN] [P3605]

    [题解]晋升者计数 Promotion Counting [USACO 17 JAN] [P3605] 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训.!牛是可怕的管理者! [题目描 ...

  8. 【概率论】1-2:计数方法(Counting Methods)

    title: [概率论]1-2:计数方法(Counting Methods) categories: Mathematic Probability keywords: Counting Methods ...

  9. Leetcode之动态规划(DP)专题-338. 比特位计数(Counting Bits)

    Leetcode之动态规划(DP)专题-338. 比特位计数(Counting Bits) 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数 ...

随机推荐

  1. Could not find file '..\bin\hibernate.cfg.xml'解决方法:

    web.config: 解决方法:

  2. ADT eclipse打开时出现Error: Error parsing C:\Users\admin*\.android\devices.xml

    Error: Error parsing C:\Users\admin*\.android\devices.xml  在ADT eclipse打开项目的时候出现此提示,但是又不影响使用. 原因:之前安 ...

  3. Luence简单实现2

    上一篇是基于内存存储的,这次的例子是基于本地存储索引库. 上一次的代码稍微修改,代码如下: //创建词法分析器 Analyzer analyzer = new StandardAnalyzer(); ...

  4. 1509: [NOI2003]逃学的小孩 - BZOJ

    Description Input 第一行是两个整数N(3  N  200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的信息.第i+1行包含整数Ui.Vi.Ti(1Ui ...

  5. Tern Server Timeout

  6. Hibernate各种主键生成策略与配置详解【附1--<generator class="foreign">】

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

  7. Jquery 查看DOM上绑定的事件列表

    $(dom).data( "events" ); 包括事件类型和关联的处理函数 下面是firefox的截图

  8. gcd,lcm,ext_gcd,inv

    Least Common Multiple http://acm.hdu.edu.cn/showproblem.php?pid=1019 #include<cstdio> int gcd( ...

  9. [错误]试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

    错误原因: dll文件是在64位机下编译的,而服务器是32位机,所以无法调用 或者dll文件是在64位开发环境下下编译的,而现在的调用程序是的32位,所以无法调用 注意项目属性:

  10. hdoj 2204 Eddy's爱好

    原文链接:http://www.cnblogs.com/DrunBee/archive/2012/09/05/2672546.html 题意:给你一个正整数N,确定在1到N之间有多少个可以表示成M^K ...