题目链接: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的更多相关文章

  1. 动态规划(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 ...

  2. hdu 4630 查询[L,R]区间内任意两个数的最大公约数

    No Pain No Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. 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 - ...

  4. HDU 6437 Problem L.Videos (最大费用)【费用流】

    <题目链接> 题目大意: 一天有N个小时,有m个节目(每种节目都有类型),有k个人,连续看相同类型的节目会扣w快乐值.每一种节目有都一个播放区间[l,r].每个人同一时间只能看一个节目,看 ...

  5. 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 ...

  6. hdu 5116 计数

    题目大意:给你n个点, n个点的坐标都在200以内,让你统计不相交的两个L形的种数,且L形的两条边长的gcd = 1. 思路:用二维树状数组维护点的信息,然后划分区块进行统计,题解是用总的减去相交的, ...

  7. HDU 6330.Problem L. Visual Cube-模拟到上天-输出立方体 (2018 Multi-University Training Contest 3 1012)

    6330.Problem L. Visual Cube 这个题就是输出立方体.当时写完怎么都不过,后来输出b<c的情况,发现这里写挫了,判断失误.加了点东西就过了,mdzz... 代码: //1 ...

  8. HDU - 6437 Problem L.Videos 2018 Multi-University Training Contest 10 (最小费用最大流)

    题意:M个影片,其属性有开始时间S,结束时间T,类型op和权值val.有K个人,每个人可以看若干个时间不相交的影片,其获得的收益是这个影片的权值val,但如果观看的影片相邻为相同的属性,那么收益要减少 ...

  9. 2014ACM/ICPC亚洲区北京站题解

    本题解不包括个人觉得太水的题(J题本人偷懒没做). 个人觉得这场其实HDU-5116要比HDU-5118难,不过赛场情况似乎不是这样.怀疑是因为老司机带错了路. 这套题,个人感觉动态规划和数论是两个主 ...

随机推荐

  1. kafka搭建笔记

    环境CentOS7.0,JDK1.8 一.下载安装 在kafka官网 http://kafka.apache.org/downloads下载到最新的kafka安装包 下载 2.0.0 release, ...

  2. [COGS2652]秘术「天文密葬法」

    description 题面 给个树,第\(i\)个点有两个权值\(a_i\)和\(b_i\),现在求一条长度为\(m\)的路径,使得\(\frac{\sum a_i}{\sum b_i}\)最小 d ...

  3. Android中WebView的跨域漏洞分析和应用被克隆问题情景还原(免Root获取应用沙盒数据)

    一.前言 去年年底支付宝的被克隆漏洞被爆出,无独有偶就是腾讯干的,其实真正了解这个事件之后会发现,感觉是针对支付宝.因为这个漏洞找出肯定花费了很大劲,主要是因为支付宝的特殊业务需要开启了WebView ...

  4. BZOJ1058:[ZJOI2007]报表统计——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=1058 https://www.luogu.org/problemnew/show/P1110#su ...

  5. CF359D:Pair of Numbers——题解

    https://vjudge.net/problem/CodeForces-359D http://codeforces.com/problemset/problem/359/D 题目大意: 给一串数 ...

  6. 洛谷4577 & LOJ2521:[FJOI2018]领导集团问题——题解

    https://www.luogu.org/problemnew/show/P4577 https://loj.ac/problem/2521 参考:https://www.luogu.org/blo ...

  7. sd卡的访问

    一般再访问sd卡前都要获取sd卡的路径,以防止不同的厂商有不同的路径配置.Android提供了Environment类来获取系统当前sd卡路径. Log.d(TAG, Environment.getE ...

  8. ACE线程管理机制-面向对象的线程类ACE_Task

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/05/583231.html 我们在前一章中使用ACE_Thread包装时,你一定已经注意到了一 ...

  9. HDU 3487 Splay tree

    Play with Chain Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  10. css+vue实现添加购物车效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...