1393 - Highways(问题抽象)(容斥原理计数)
来源:互联网 发布:新闻app源码 编辑:程序博客网 时间:2024/06/11 20:25
问题的方向是对称的,统计\*2即可,当gcd(a,b)>1及重复,
证:a*b满足gcd(a,b)>1,在他对角线和a'和b'对角线是同一条直线(a'=a/gcd(a,b)b'=b/gcd(a,b))
其次,如果放置位置不够靠左,也不够靠上,则它和它“左上方”的包围盒也重复了
假定左上角坐标(0,0)则对于左上角在(x,y)的包围盒,其左上方的包围盒的左上角为(x-a,y-b),这个左上角合法条件是x-a>=0,y-b>=0
包围盒本身不出界的条件是x+a<=m-1,y+b<=n-1,一共(m-a)*(n-b)个,而左上方有包围盒的情况,即a<=x<=m-a-1
且b<=y<=n-b-1,有c=max(0,m-2*a)*max(0,n-2b)种放法,相减得到:a*b的包围盒有(m-a)(n-b)-c
另外注意应预处理保存所有的gcd,而不是边枚举边算,否则会超时。
分两步,首先计算出从点[1, 1]到[n, m]格子组成的边界的连线,然后这是需要容斥去重的,这个有新的数能加的可能是当维度i和j是互质的时候就会多一个,然后就是递推n*m的格子的总个数,也要容斥去重,这个就是减去减半的数,这个是因为会重线,最后是对称,从左上到右下,和从坐下到右上
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const int maxn=310;int n,m;ll dp[maxn][maxn],ans[maxn][maxn];int gcd(int a,int b){ return b==0?a:gcd(b,a%b);}void init(){ memset(dp,0,sizeof(dp)); memset(ans,0,sizeof(ans)); for(int i=1;i<=300;i++) for(int j=1;j<=300;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<=300;i++) for(int j=1;j<=300;j++) ans[i][j]=ans[i-1][j]+ans[i][j-1]-ans[i-1][j-1]+dp[i][j]-dp[i>>1][j>>1];}int main(){ init(); while(scanf("%d%d",&n,&m)!=EOF&&n+m){ printf("%lld\n",ans[n-1][m-1]*2); } return 0;}
0 0
- 1393 - Highways(问题抽象)(容斥原理计数)
- UVA 1393 - Highways (容斥原理计数)
- uva 1393 - Highways(容斥原理)
- 1393 - Highways 计数问题
- 容斥原理 集合计数
- BZOJ 2839 集合计数 容斥原理
- 【BZOJ2839】集合计数,容斥原理
- [容斥原理] BZOJ 2839 集合计数
- hihoCoder1476 矩阵计数 容斥原理
- bzoj2839集合计数 容斥原理
- [容斥原理]BZOJ 2839: 集合计数
- LA 3720 Highways (计数问题)
- UVA 12075 - Counting Triangles(容斥原理计数)
- HDU 4390 Number Sequence (容斥原理+组合计数)
- 【BZOJ1042】[HAOI2008]硬币购物【计数DP】【容斥原理】
- 容斥原理 —— 不重不漏的计数
- bzoj 2839: 集合计数 (容斥原理)
- [BZOJ2839]集合计数(容斥原理+组合数学)
- 表格
- 我的理想,我的奋斗目标
- 美团推荐算法实践:机器学习重排序模型成亮点
- 九章算法面试题12 最大子区间/矩阵
- mysql的基本操作
- 1393 - Highways(问题抽象)(容斥原理计数)
- Bean作用域的配置以及 Spring各种注入方式实例 list set map props
- eclipse maven mahout环境搭建
- 我是如何做原型设计的
- Bluemix云平台实践:DevOps
- Android---38---SQLiteOpenHelper类
- 九章算法面试题13 随机数生成器
- 使用MediaTracker加载及显示图像
- poj 1625