UVa 1393 (容斥原理、GCD) Highways
题意:
给出一个n行m列的点阵,求共有多少条非水平非竖直线至少经过其中两点。

分析:
首先说紫书上的思路,编程较简单且容易理解。由于对称性,所以只统计“\”这种线型的,最后乘2即是答案。
枚举斜线包围盒的大小,如果盒子的长宽ab互质,则是可以的。这种盒子共有(m-a)(n-b)个,但要减去其中重复的。如果有一个长宽为2a和2b的大盒子,则计数右下角的小盒子的同时,左上角的小盒子会重复,所以要减去重复的盒子的个数c = max(0, m-2a) * max(0, n-2b)
最后gcd(a, b)的值是要预处理的
#include <cstdio>
#include <algorithm> const int maxn = ;
int gcd[maxn+][maxn+]; int GCD(int a, int b)
{
return b == ? a : GCD(b, a%b);
} int main()
{
for(int i = ; i <= maxn; ++i)
for(int j = ; j <= i; ++j)
gcd[i][j] = gcd[j][i] = GCD(i, j); int n, m;
while(scanf("%d%d", &n, &m) == && n)
{
int ans = ;
for(int a = ; a <= n; ++a)
for(int b = ; b <= m; ++b)
if(gcd[a][b] == )
{
int c = std::max(, n-a*) * std::max(, m-b*);
ans += (n-a)*(m-b) - c;
} printf("%d\n", ans * );
} return ;
}
代码君
解法二:
解法转自UVA 1393 - Highways (容斥原理计数)
dp(i, j)表示在长宽为ij的盒子中,从左上角最多能连多少条不重复的直线。
可以根据容斥原理递推dp(i, j) = dp(i-1, j) + dp(i, j-1) - dp(i-1, j-1) + (gcd(i, j) = 1) (因为盒子两边长互质的时候,才能连出一条新边出来)
最后答案ans递推的形式也是一样的,但重复的连线是那些缩小两倍后仍存在的直线
ans(i, j) = ans(i-1, j) + ans(i, j-1) - ans(i-1, j-1) + dp(i, j) - dp(i/2, j/2)
最后代码中,本想着只计算一半答案会快一点,结果排名21,登榜失败。
#include <cstdio>
#include <algorithm> const int maxn = ;
int dp[maxn+][maxn+], ans[maxn+][maxn+]; int gcd(int a, int b)
{
return b == ? a : gcd(b, a%b);
} void Init()
{
for(int i = ; i <= maxn; ++i)
for(int j = ; j <= i; ++j)
{
if(i == j) dp[i][j] = dp[i][j-] * - dp[i-][j-] + (gcd(i, j) == );
else 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 <= i; ++j)
{
if(i == j) ans[i][j] = ans[i][j-] * - ans[i-][j-] + dp[i][j] - dp[i/][j/];
else ans[i][j] = ans[i][j-] + ans[i-][j] - ans[i-][j-] + dp[i][j] - dp[i/][j/];
}
} int main()
{
Init();
int n, m;
while(scanf("%d%d", &n, &m) == && n)
{
if(n < m) std::swap(n, m);
printf("%d\n", ans[n-][m-]*);
} return ;
}
代码君
UVa 1393 (容斥原理、GCD) Highways的更多相关文章
- uva 1393 - Highways(容斥原理)
题目连接:uva 1393 - Highways 题目大意:给定一个m∗n的矩阵,将矩阵上的点两两相连,问有多少条直线至少经过两点. 解题思路:头一次做这样的题目,卡了一晚上. dp[i][j]即为i ...
- uva 10951 - Polynomial GCD(欧几里得)
题目链接:uva 10951 - Polynomial GCD 题目大意:给出n和两个多项式,求两个多项式在全部操作均模n的情况下最大公约数是多少. 解题思路:欧几里得算法,就是为多项式这个数据类型重 ...
- UVA 10951 - Polynomial GCD(数论)
UVA 10951 - Polynomial GCD 题目链接 题意:给定两个多项式,求多项式的gcd,要求首项次数为1,多项式中的运算都%n,而且n为素数. 思路:和gcd基本一样,仅仅只是传入的是 ...
- UVa 1393 - Highways(数论)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 1393 Highways(数学思想)
题意:给你n.m(n,m<=200),问你有多少条非水平.非垂直的直线有多少条经过至少两个点 题解:我们需要枚举的是只画一条线的矩形,对于大小a*b的矩形必须保证gcd(a,b)=1才能不重复 ...
- UVA 1393 Highways
https://vjudge.net/problem/UVA-1393 题意: a*b的点阵中能画多少条非水平非竖直的直线 方向‘/’ 和 方向 ‘\’ 对称 枚举直线所在矩形的i*j 直线可能重复的 ...
- UVA 1393 Highways,UVA 12075 Counting Triangles —— (组合数,dp)
先看第一题,有n*m个点,求在这些点中,有多少条直线,经过了至少两点,且不是水平的也不是竖直的. 分析:由于对称性,我们只要求一个方向的线即可.该题分成两个过程,第一个过程是求出n*m的矩形中,dp[ ...
- hdu (欧拉函数+容斥原理) GCD
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1695 看了别人的方法才会做 参考博客http://blog.csdn.net/shiren_Bod/ar ...
- UVa 1642 - Magical GCD(数论)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
随机推荐
- 关于python多线程编程中join()和setDaemon()的一点儿探究
关于python多线程编程中join()和setDaemon()的用法,这两天我看网上的资料看得头晕脑涨也没看懂,干脆就做一个实验来看看吧. 首先是编写实验的基础代码,创建一个名为MyThread的 ...
- Android判断用户是平板还是手机的方法
public boolean isTabletDevice() { TelephonyManager telephony = (TelephonyManager) mContext.ge ...
- 在Qt Creator中添加OpenCV库
在项目的pro文件中添加如下代码:INCLUDEPATH += D:/opencv/build/include win32:CONFIG(debug, debug|release): {LIBS += ...
- (转)使用Migrations更新数据库结构(Code First )
原文地址:http://blog.csdn.net/luoyeyu1989/article/details/8275237 背景 code first起初当修改model后,要持久化至数据库中时,总要 ...
- (转)Linux SLUB 分配器详解
原文网址:https://www.ibm.com/developerworks/cn/linux/l-cn-slub/ 多年以来,Linux 内核使用一种称为 SLAB 的内核对象缓冲区分配器.但是, ...
- poj 3041 Asteroids (最大匹配最小顶点覆盖——匈牙利模板题)
http://poj.org/problem?id=3041 Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submissions ...
- 关于android内存泄漏的研究
博客建了几个月,都没有去写,一是因为当时换工作,然后又是新入职(你懂的,好好表现),比较忙:二是也因为自己没有写博客的习惯了.现在还算是比较稳定了,加上这个迭代基本也快结束了,有点时间来写写博客.好了 ...
- 1185: [HNOI2007]最小矩形覆盖 - BZOJ
就是一道凸包(枚举凸包的边作为矩形的一条边)的裸题,只是不太好打,所以犹豫到今天才打 不说了,说起AC都是泪啊,因为没有精度判断,没有判重(算距离时除0了)错了好久 拍了好久都和标称是一样的,因为 ...
- ubuntu的vi
ubuntu12.04的vi 1. 安装vim full版本由于Ubuntu预安装的是tiny版本,就会导致我们在使用上的产生不便.所以我们要安装vim的full版本.首先,先卸掉旧版的vi,输入以下 ...
- WebUI框架
Telerik Kendo UI http://demos.telerik.com/kendo-ui/window/right-to-left-support