zoukankan      html  css  js  c++  java
  • 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

     1 #include <cstdio>
     2 typedef long long LL;
     3 
     4 const int maxn = 1005;
     5 LL dp[maxn + 5][maxn + 5], sum[maxn + 5][maxn + 5];
     6 
     7 int gcd(int a, int b) { return b == 0 ? a : gcd(b, a%b); }
     8 
     9 LL C(LL n) { return (LL)n * (n-1) / 2 * (n-2) / 3; }
    10 
    11 int main()
    12 {
    13     for(int i = 2; i <= maxn; i++)
    14         for(int j = 2; j <= maxn; j++)
    15             dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + gcd(i, j) - 1;
    16     for(int i = 2; i <= maxn; i++)
    17         for(int j = 2; j <= maxn; j++)
    18             sum[i][j] = dp[i][j] + sum[i][j-1] + sum[i-1][j] - sum[i-1][j-1];
    19 
    20     int n, m, kase = 0;
    21     while(scanf("%d%d", &n, &m) == 2 && n)
    22     {
    23         n++; m++;
    24         printf("Case %d: %lld
    ", ++kase, C(n*m) - C(n)*m - C(m)*n - sum[n-1][m-1] * 2);
    25     }
    26 
    27     return 0;
    28 }
    代码君
  • 相关阅读:
    DOM解析和SAX解析对比
    SAX解析示例代码和原理
    xPath技术
    dom4j工具对XML写入修改删除操作实现
    Dom4j工具j解析XML原理和示例代码
    Servlet的多线程并发问题
    Servlet的自动加载
    servlet缺省路径
    线程安全问题出现 的根本原因和解决方案
    9.12測试(四)——測试笔
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4368355.html
Copyright © 2011-2022 走看看