bzoj 3505 数三角形 组合数 解题报告
来源:互联网 发布:淘宝上正品金丝楠木店 编辑:程序博客网 时间:2024/04/30 10:12
Description
给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个。下图为4×4的网格上的一个三角形。
注意三角形的三点不能共线。
Input
输入一行,包含两个空格分隔的正整数m和n。
Output
输出一个正整数,为所求三角形数量。
Sample Input
2 2
Sample Output
76
数据范围
1<=m,n<=1000
思路
话说我刚刚拿到这道题,以为是计算几何。。。
后来发现跟几何几乎没有关系,数论题。。。
首先在平面内任意取三个点。c【当前格子】【点数】表示点,首先c【N】【0】=1,然后用递推的方式得出剩下的。减去在行、列、斜线上(可以用gcd)的三点共线情况,剩下的就是三角形的数量。
要注意的是,n与m的值要加上1,才是格点的个数。还有gcd判断那个地方,仔细理解一下,还是挺巧的(划掉)。
代码
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>using namespace std;const int N=1000000+10;//最多的格子 int n,m;long long c[N][4],ans,tmp;int gcd(int a,int b){ return b==0?a:gcd(b,a%b);}void get(){ c[0][0]=1; for (int i=1;i<=n*m;i++) { c[i][0]=1; for (int j=1;j<=3;j++) c[i][j]=c[i-1][j-1]+c[i-1][j]; }}int main(){ scanf("%lld%lld",&n,&m); n++;m++; get(); ans=c[n*m][3]; ans-=n*c[m][3];//行 ans-=m*c[n][3];//列 for (int i=1;i<n;i++) for (int j=1;j<m;j++) { tmp=gcd(i,j)+1; if (tmp>2) ans-=(tmp-2)*2*(n-i)*(m-j);//斜线 } printf("%lld",ans); return 0;}
阅读全文
2 0
- bzoj 3505 数三角形 组合数 解题报告
- BZOJ 3505 CQOI2014 数三角形 组合数学
- BZOJ 3505: [Cqoi2014]数三角形|组合数学
- [组合计数] BZOJ 3505 [Cqoi2014]数三角形
- 【BZOJ 3505】[Cqoi2014]数三角形 组合数学
- bzoj 3505 [Cqoi2014]数三角形 组合
- BZOJ 3505 数三角形 (数论 组合数 gcd)
- 组合数问题 解题报告
- BZOJ 3505 数三角形
- BZOJ3505: [Cqoi2014]数三角形 解题报告
- poj1753解题报告(枚举、组合数)
- 【NOIP 2016】 组合数问题 解题报告
- 【BZOJ】【P3505】【CQOI2014】【数三角形】【题解】【组合数】
- 【bzoj 3505】: [Cqoi2014]数三角形
- BZOJ-3505-数三角形-CQOI2014
- 【BZOJ 3505】 [Cqoi2014]数三角形
- BZOJ-3505 数三角形 排列组合
- bzoj 3505: [Cqoi2014]数三角形
- gcc编译系统
- 启动resin报错:Error runningnewResin: Can't find neither 'server' nor 'server-default' nor 'server-multi'
- pandas基础介绍
- lintcode 加一(Plus One )(Java)
- Java门面模式(或外观模式)
- bzoj 3505 数三角形 组合数 解题报告
- RecyclerView瀑布流如何动态计算imageview的宽高
- android 引导页的制作
- SAP审批策略相关表
- 开发中常见小问题(笔记)
- 对接 PDA 问题件扫描确认上架
- Python中的下划线'_'用法
- maven打包的时候报错:Failed to execute goalcom.google.code.maven-svn-revision-number-plugin:svn-revision-num
- Java中ArrayList和LinkedList区别