HDU 5116 Everlasting L
题目链接:HDU-5116
题意:给定若干个整数点,若一个点集满足P = {(x, y), (x + 1, y), . . . , (x + a, y), (x, y + 1), . . . , (x, y + b)}(a, b ≥ 1) 且 gcd(a, b)==1 则称这是一个好(a, b)-L集。求共有多少个(A, B)满足A,B都是好L集且A,B不相交。
思路是先找出好L集的数量a,再找出相交的好L集对数b,则答案为a * a - b 。
首先要解决的第一个问题是求出a,一个自然的思路是对于每个点,分别向右、向下搜索,但是这样做会超时。所以我们需要优化一下。
首先算出每个点向右、向下最远长度,记为rght[i][j]和down[i][j]。然后对于每个点,在向右搜索时,对于当前搜索到的长度L,我们希望能知道有多少向下的长度D可以与之组成一个好L-集。所以优化的思路就是处理出在[ 1, down[i][j] ]范围内,有多少数与L互质。我们用f[i][j]表示在[0, j]范围内有多少数与i的gcd等于1。
这样我们就解决了第一个问题。
对于第二个问题,我们处理出,对于每一个点(i, j),有多少好L-集的下路经过点(i, j),用sum[i][j]表示,那么假设存在x个右路经过点(i, j)的好L-集,则 b += 2 * x * sum[i][j]。
具体请参照代码:
//f[i][j]表示在[1,j]范围内,有多少数与i的gcd=1。
//g[i][j]表示在sum(gcd(a,b)==1) (1<=a<=i && 1<=b<=j)
//rght[i][j]表示点(i, j)右路最长长度
//down[i][j]表示点(i, j)下路最长长度
//sum[i][j]表示下路通过(i, j)的好L-集的个数 #include<cstdio>
#include<set>
#include<map>
#include<cstring>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
typedef long long LL; const LL MAXN=; LL gcd(LL a,LL b)
{
if(b==) return a;
return gcd(b,a%b);
}
bool vis[MAXN][MAXN];
LL g[MAXN][MAXN],f[MAXN][MAXN],down[MAXN][MAXN],rght[MAXN][MAXN],sum[MAXN][MAXN];
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
memset(g,,sizeof(g));
memset(f,,sizeof(f));
for(LL i=;i<=;i++)
for(LL j=;j<=;j++)
{
f[i][j]=f[i][j-]+(gcd(i,j)==);
g[i][j]=g[i-][j]+f[i][j];
}
LL T;
scanf("%lld",&T);
for(LL tt=;tt<=T;tt++)
{
memset(down,,sizeof(down));
memset(rght,,sizeof(rght));
memset(vis,,sizeof(vis));
memset(sum,,sizeof(sum));
LL n;
scanf("%lld",&n);
for(LL i=;i<=n;i++)
{
LL x,y;
scanf("%lld%lld",&x,&y);
vis[x][y]=;
}
for(LL i=;i>=;i--)
for(LL j=;j>=;j--)
if(vis[i][j])
{
if(vis[i+][j]) down[i][j]=down[i+][j]+;
if(vis[i][j+]) rght[i][j]=rght[i][j+]+;
}
LL a=;
memset(sum,,sizeof(sum));
for(LL i=;i<=;i++)
for(LL j=;j<=;j++)
if(vis[i][j])
{
LL cnt[MAXN];
memset(cnt,,sizeof(cnt));
for(LL k=;k<=down[i][j];k++)
cnt[k]+=f[k][rght[i][j]];
for(LL k=down[i][j]-;k>=;k--)
cnt[k]+=cnt[k+];
for(LL k=;k<=down[i][j];k++)
sum[i+k][j]+=cnt[k];
a+=cnt[];
}
LL b=;
for(LL i=;i<=;i++)
for(LL j=;j<=;j++)
if(vis[i][j])
{
LL cnt=;
for(LL k=rght[i][j];k>=;k--)
{
cnt+=f[k][down[i][j]];
b+=*cnt*sum[i][j+k];
}
b-=g[down[i][j]][rght[i][j]]*g[down[i][j]][rght[i][j]];
}
printf("Case #%lld: %lld\n",tt,a*a-b);
}
return ;
}
HDU 5116 Everlasting L的更多相关文章
- 动态规划(DP计数):HDU 5116 Everlasting L
Matt loves letter L.A point set P is (a, b)-L if and only if there exists x, y satisfying:P = {(x, y ...
- hdu 4630 查询[L,R]区间内任意两个数的最大公约数
No Pain No Game Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 6343.Problem L. Graph Theory Homework-数学 (2018 Multi-University Training Contest 4 1012)
6343.Problem L. Graph Theory Homework 官方题解: 一篇写的很好的博客: HDU 6343 - Problem L. Graph Theory Homework - ...
- HDU 6437 Problem L.Videos (最大费用)【费用流】
<题目链接> 题目大意: 一天有N个小时,有m个节目(每种节目都有类型),有k个人,连续看相同类型的节目会扣w快乐值.每一种节目有都一个播放区间[l,r].每个人同一时间只能看一个节目,看 ...
- HDU 6343 - Problem L. Graph Theory Homework - [(伪装成图论题的)简单数学题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6343 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...
- hdu 5116 计数
题目大意:给你n个点, n个点的坐标都在200以内,让你统计不相交的两个L形的种数,且L形的两条边长的gcd = 1. 思路:用二维树状数组维护点的信息,然后划分区块进行统计,题解是用总的减去相交的, ...
- HDU 6330.Problem L. Visual Cube-模拟到上天-输出立方体 (2018 Multi-University Training Contest 3 1012)
6330.Problem L. Visual Cube 这个题就是输出立方体.当时写完怎么都不过,后来输出b<c的情况,发现这里写挫了,判断失误.加了点东西就过了,mdzz... 代码: //1 ...
- HDU - 6437 Problem L.Videos 2018 Multi-University Training Contest 10 (最小费用最大流)
题意:M个影片,其属性有开始时间S,结束时间T,类型op和权值val.有K个人,每个人可以看若干个时间不相交的影片,其获得的收益是这个影片的权值val,但如果观看的影片相邻为相同的属性,那么收益要减少 ...
- 2014ACM/ICPC亚洲区北京站题解
本题解不包括个人觉得太水的题(J题本人偷懒没做). 个人觉得这场其实HDU-5116要比HDU-5118难,不过赛场情况似乎不是这样.怀疑是因为老司机带错了路. 这套题,个人感觉动态规划和数论是两个主 ...
随机推荐
- [洛谷P5205]【模板】多项式开根
题目大意:给你$n$项多项式$A(x)$,求出$B(x)$满足$B^2(x)\equiv A(x)\pmod{x^n}$ 题解:考虑已经求出$B_0(x)$满足$B_0^2(x)\equiv A(x) ...
- BZOJ4596:[SHOI2016]黑暗前的幻想乡——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4596 https://www.luogu.org/problemnew/show/P4336#su ...
- [PKUWC2018]随机算法
题意:https://loj.ac/problem/2540 给定一个图(n<=20),定义一个求最大独立集的随机化算法 产生一个排列,依次加入,能加入就加入 求得到最大独立集的概率 loj25 ...
- [CQOI2017]小Q的表格——反演好题
zhoutb2333的题解 难得一见的新颖反演题. 一眼看可能不是反演题. 修改影响别的,很恶心. 所以考虑化简f的联系式,发现和gcd有关 于是考虑用gcd来表示所有的gcd(a,b)=g的所有f( ...
- 配置好solr搜索引擎服务器后java后台如何将商品信息导入索引库
首先,在配置文件目录中添加solr 服务器的bean 配置文件 solr服务器的url可以写在配置文件中: url地址其实就是我们网页可以访问的solr地址: 然后我们写 service packag ...
- 理解Linux文件系统挂载参数noatime nodiratime
很多线上服务器为了提供文件系统IO性能,会在挂载文件系统的时候指定“noatime,nodiratime”参数,意味着当访问一个文件和目录的时候,access time都不会更新.但是如果未指定上面的 ...
- TextToast -- 自定义Toast源码
import android.content.Context;import android.graphics.Color;import android.graphics.PixelFormat;imp ...
- crontab 定期拉取代码
* * * * * cd /home/wwwroot/default/lion/ && /usr/bin/git pull origin 5hao >> /tmp/git. ...
- JavaScript中this的用法详解
JavaScript中this的用法详解 最近,跟身边学前端的朋友了解,有很多人对函数中的this的用法和指向问题比较模糊,这里写一篇博客跟大家一起探讨一下this的用法和指向性问题. 1定义 thi ...
- 转:PriorityQueue
转自:PriorityQueue 本文github地址 Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示.本文从Queue接口函数出发,结合生动的图解,深入浅出地 分析 ...