动态规划(DP计数):HDU 5116 Everlasting L
A point set P is (a, b)-L if and only if there exists x, y satisfying:
P = {(x, y), (x + 1, y), . . . , (x + a, y), (x, y + 1), . . . , (x, y + b)}(a, b ≥ 1)
A point set Q is good if and only if Q is an (a, b)-L set and gcd(a, b) = 1.
Matt is given a point set S. Please help him find the number of ordered pairs of sets (A, B) such that:
Input
For each test case, the first line contains an integer N (0 ≤ N ≤ 40000), indicating the size of the point set S.
Each of the following N lines contains two integers xi, yi, indicating the i-th point in S (1 ≤ xi, yi ≤ 200). It’s guaranteed that all (xi, yi) would be distinct.
Output
Sample Input
- 2
- 6
- 1 1
- 1 2
- 2 1
- 3 3
- 3 4
- 4 3
- 9
- 1 1
- 1 2
- 1 3
- 2 1
- 2 2
- 2 3
- 3 1
- 3 2
- 3 3
Sample Output
- Case #1: 2
- Case #2: 6
Hint
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- using namespace std;
- const int N=;
- typedef long long LL;
- LL map[N][N],st[N],S,M;
- LL f[N][N],dp[N][N],sum[N][N];
- /*f[i][j]:[1,j]中与i互质的数的个数*/
- LL dwn[N][N],rht[N][N];int T,cas,k,x,y;
- LL Gcd(LL a,LL b){return b?Gcd(b,a%b):a;}
- void Prepare(){
- for(int i=;i<=;i++)
- for(int j=;j<=;j++){
- f[i][j]=f[i][j-]+(Gcd(i,j)==);
- dp[i][j]=dp[i-][j]+f[i][j];
- }
- }
- void Init(){S=M=;
- memset(map,,sizeof(map));
- memset(sum,,sizeof(sum));
- memset(dwn,,sizeof(dwn));
- memset(rht,,sizeof(rht));
- }
- int main(){
- Prepare();
- scanf("%d",&T);
- while(T--){
- Init();scanf("%d",&k);
- while(k--){scanf("%d%d",&x,&y);map[x][y]=;}
- for(int i=;i>=;i--)
- for(int j=;j>=;j--){
- if(!map[i][j])continue;
- if(map[i+][j])dwn[i][j]=dwn[i+][j]+;
- if(map[i][j+])rht[i][j]=rht[i][j+]+;
- }
- for(int i=;i<=;i++)
- for(int j=;j<=;j++){
- if(!map[i][j])continue;
- memset(st,,sizeof(st));
- for(int k=;k<=dwn[i][j];k++)
- st[k]=f[k][rht[i][j]];
- for(int k=dwn[i][j];k>=;k--)
- st[k-]+=st[k];
- for(int k=;k<=dwn[i][j];k++)
- sum[i+k][j]+=st[k];
- S+=st[];
- }
- for(int i=;i<=;i++)
- for(int j=;j<=;j++){
- if(!dwn[i][j])continue;
- if(!rht[i][j])continue;
- LL tot=dp[dwn[i][j]][rht[i][j]];
- LL calc=sum[i][j]-tot;
- for(int k=;k<=rht[i][j];k++){
- calc+=sum[i][j+k];
- M+=*calc*f[k][dwn[i][j]];
- }
- M+=tot*tot;
- }
- printf("Case #%d: %lld\n",++cas,S*S-M);
- }
- return ;
- }
动态规划(DP计数):HDU 5116 Everlasting L的更多相关文章
- HDU 5116 Everlasting L
题目链接:HDU-5116 题意:给定若干个整数点,若一个点集满足P = {(x, y), (x + 1, y), . . . , (x + a, y), (x, y + 1), . . . , (x ...
- HDU 4055 The King’s Ups and Downs(DP计数)
题意: 国王的士兵有n个,每个人的身高都不同,国王要将他们排列,必须一高一矮间隔进行,即其中的一个人必须同时高于(或低于)左边和右边.问可能的排列数.例子有1千个,但是最多只算到20个士兵,并且20个 ...
- HDU 4055 Number String(DP计数)
题意: 给你一个含n个字符的字符串,字符为'D'时表示小于号,字符为“I”时表示大于号,字符为“?”时表示大小于都可以.比如排列 {3, 1, 2, 7, 4, 6, 5} 表示为字符串 DIIDID ...
- 算法-动态规划DP小记
算法-动态规划DP小记 动态规划算法是一种比较灵活的算法,针对具体的问题要具体分析,其宗旨就是要找出要解决问题的状态,然后逆向转化为求解子问题,最终回到已知的初始态,然后再顺序累计各个子问题的解从而得 ...
- Tetrahedron(Codeforces Round #113 (Div. 2) + 打表找规律 + dp计数)
题目链接: https://codeforces.com/contest/166/problem/E 题目: 题意: 给你一个三菱锥,初始时你在D点,然后你每次可以往相邻的顶点移动,问你第n步回到D点 ...
- Vijos p1770 大内密探 树形DP+计数
4天终于做出来了,没错我就是这么蒟蒻.教训还是很多的. 建议大家以后编树形DP不要用记忆化搜索,回溯转移状态个人感觉更有条理性. 大神题解传送门 by iwtwiioi 我的题解大家可以看注释&quo ...
- hdu 4630 查询[L,R]区间内任意两个数的最大公约数
No Pain No Game Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 动态规划dp
一.概念:动态规划dp:是一种分阶段求解决策问题的数学思想. 总结起来就一句话:大事化小,小事化了 二.例子 1.走台阶问题 F(10):10级台阶的走法数量 所以:F(10)=F(9)+F(8) F ...
- 【POJ1952】逢低吸纳 dp+计数
题目大意:给定一个有 N 个数的序列,求其最长下降子序列的长度,并求出有多少种不同的最长下降子序列.(子序列各项数值相同视为同一种) update at 2019.4.3 题解:求最长下降子序列本身并 ...
随机推荐
- jQuery 源码分析3: jQuery.fn/ jQuery.prototype
// 建立方法实例,提高方法访问的速度(避免在原型链上搜索) var deletedIds = []; var slice = deletedIds.slice; var concat = delet ...
- greenplum学习
公司TM蛋疼,动不动让你学习新东西,就是不让你闲下来,本着胳膊拧不过大腿定律,忍了,这是背景. 好吧哥端起一本厚厚的<GreenPlum企业应用实战>,打开百度开始GP的学习之路: GP只 ...
- 利用iptables来配置linux禁止所有端口登陆和开放指定端口
from:http://www.myhack58.com/Article/sort099/sort0102/2011/31781.htm 1.关闭所有的 INPUT FORWARD OUTPUT 只对 ...
- Fedora 21 安装QQ国际版
首先安装依赖包 sudo yum install freetype.i686 libpng.i686 libgcc.i686 libXau.i686 点击下载wine-2012qq国际版 unzip ...
- 使用Fiddler提高前端工作效率 (介绍篇)
1. Fiddler 是什么? Fiddler是用C#编写的一个免费的HTTP/HTTPS网络调试器.英语中Fiddler是小提琴的意思,Fiddler Web Debugger就像小提琴一样,可以让 ...
- Delphi实用小function
Write Log // strLog : the log content need write to log file; // strFile: the compliete file path(in ...
- python 数据字典应用
一.什么是字典? 字典是Python语言中唯一的映射类型. 映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表. 字典对象是可变的,它是一个容器 ...
- POJ 3122 Pie 二分枚举
题目:http://poj.org/problem?id=3122 这个题就好多了,没有恶心的精度问题,所以1A了.. #include <stdio.h> #include <ma ...
- 用JS实现避免重复加载相同js文件
我们在日常开发过程中,可能有重复加载同一个资源例如:1.js,为了提高性能和用户体验这里我们用原生JS实现同一个资源只加载一次. 下面是 common.js里的JS代码 //使用沙箱模式防止污染外面的 ...
- silverlight5开发的翻牌游戏
扑克牌用了一个自定义控件,代码如下 public class CardButton : Button { public int state;//是否翻转0是未翻转,1是已翻转 private stat ...