题目大意 多组数据,每组数据给定两个整数 \(n,m\),请求出 \(n\times m\) 的点阵(即 \((n-1)\times(m-1)\) 的方格)中有多少条非水平竖直的经过至少两个格点的不同直线。

分析 这道题有多种解法,这里给出最经典的,使用容斥原理的解法。

令 \(dp[i][j]\) 表示 \(i\times j\) 的方格中,经过 \((0,0)\) 顶点的所有至少经过两个点的不同直线数(比如 \(dp[3][2]=5\))。

不难发现,\(dp\) 数组满足可加可减性,也即可以用容斥原理来递推。且点 \((i,j)\) 当且仅当 \(GCD(i,j)=1\) 时可以为 \(dp[i][j]\) 贡献 \(1\)。所以有

\[dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+[gcd(i,j)=1]
\]

现在考虑如何用 \(dp\) 数组来递推出最终答案。我们记 \(i\times j\) 方格中从左下到右上的不同直线数为 \(ans[i][j]\),则最终答案为 \(2\times ans[i][j]\)(比如 \(ans[3][2]=14\))。

不难看出,\(ans\) 数组也满足可加可减性,可以用容斥原理来递推。且点 \((i,j)\) 构成的新直线当且仅当它在 \(dp[i][j]\) 中而不在 \(dp[i/2][j/2]\) 中才有贡献,这是因为如果它在被重复计算过则一定在 \(dp[i/2][j/2]\) 中被计算过(为什么),所以有

\[ans[i][j]=ans[i-1][j]+ans[i][j-1]-ans[i-1][j-1]+dp[i][j]-dp[i/2][j/2]
\]

#include<bits/stdc++.h>
using namespace std; const int maxn = 305;
const int maxm = 305; int n, m;
int dp[maxn][maxm];
int ans[maxn][maxm]; void Init(int N, int M)
{
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= M; ++j)
dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + (__gcd(i, j) == 1); for(int i = 1; i <= N; ++i)
for(int j = 1; j <= M; ++j)
ans[i][j] = ans[i - 1][j] + ans[i][j - 1] - ans[i - 1][j - 1] + dp[i][j] - dp[i / 2][j / 2];
} int main()
{
Init(300, 300);
while(~scanf("%d%d", &n, &m) && n && m)
printf("%d\n", 2 * ans[n - 1][m - 1]);
}

题解 LA3720的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. [转]【译】.NET Core 3.0 中的新变化

    .NET Core 3.0 是 .NET Core 平台的下一主要版本.本文回顾了 .Net Core 发展历史,并展示了它是如何从基本支持 Web 和数据工作负载的版本 1,发展成为能够运行 Web ...

  2. HDU 1271

    这题做了好久..... 理解别人的代码都理解了好久!!!太弱太弱. #include<iostream> #include<algorithm> #include<cma ...

  3. dotnet 设计规范 · 结构体定义

    X 不要给结构体默认构造函数 默认的C#编译器也不让开发者定义有默认构造的结构体 X 不要定义易变的属性 易变的属性指的是在调用属性返回值的时候返回的是新的实例,易变的属性会有很多的问题. ✓ 需要确 ...

  4. java io流与序列化反序列化

    java的io是实现输入和输出的基础,可以方便的实现数据的输入和输出操作. 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入 ...

  5. 【codeforces 749A】Bachgold Problem

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  6. Jasypt加密SpringBoot配置文件

    如果 SpringBoot 的 properties 文件中含有用户名密码等敏感信息,为了安全起见需要对明文密码加密.Jasypt 是用来加密的 jar 包. 1.引入 Jasypt 在 pom.xm ...

  7. ZR并查集专题

    ZR并查集专题 并查集,作为一个基础算法,对于初学者来说,下面的代码是维护连通性的利器 return fa[x] == x ? x : fa[x] = getf(fa[x]); 所以,但是这对并查集的 ...

  8. 基于Springboot+Junit+Mockito做单元测试

    前言 前面的两篇文章讨论过< 为什么要写单元测试,何时写,写多细 >和<单元测试规范>,这篇文章介绍如何使用Springboot+Junit+Mockito做单元测试,案例选取 ...

  9. ZR993

    ZR993 首先,这种和平方有关的,首先应当考虑根号做法 这道题目,我们可以直接暴力\(\log_{10}w + 10\)判断一个数是否能够由原数变化的到 直接\(O(\sqrt{n})\)枚举所有的 ...

  10. 记一次奇葩事——html5可能不支持window.onscroll函数

    只在html5里遇到,html4没事:拿出来聊聊,路过帮忙解答下!!! 不正常的 <!doctype html><html><head><meta chars ...