BZOJ3505 数三角形 题解 【数论】
来源:互联网 发布:c 数据采集系统源代码 编辑:程序博客网 时间:2024/06/05 08:39
【题目描述】
给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个。下图为4x4的网格上的一个三角形。
(这里真的没有图片)
注意三角形的三点不能共线。
【题解】
这道题的题目实质上就给了我们一个提示:三点共线的点。我们只需要找出所有的点的组合(排列组合),再减去这其中共线的就行了。共线的点有三类:同行,同列,同斜线(判断gcd)
为了解决同斜线的情况,我们打一个gcd的表,再用这个表算术就行了。
代码如下:
#include<cstdio>#define LL long longint gcd[1010][1010];int n,m;LL t,ans;inline int getgcd(int a,int b){ if(gcd[a][b])return gcd[a][b]; if(!a)return gcd[a][b]=b; if(!b)return gcd[a][b]=a; return gcd[a][b]=getgcd(b,a%b);}inline void calc()//打表算出两数的gcd { for(int i=1;i<=m;i++)gcd[0][i]=i; for(int i=1;i<=n;i++)gcd[i][0]=i; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) getgcd(i,j);}int main(){ scanf("%d%d",&n,&m); calc(); t=(n+1)*(m+1); ans=t*(t-1)*(t-2)/6;//从这么多点里面选三个的全部情况 for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) if(i||j)//减去三点共线的情况 { if(!i||!j)ans-=(LL)(gcd[i][j]-1)*(n-i+1)*(m-j+1); else ans-=(LL)2*(gcd[i][j]-1)*(n-i+1)*(m-j+1); } printf("%lld",ans); return 0;}
阅读全文
1 0
- BZOJ3505 数三角形 题解 【数论】
- 【BZOJ3505】【数论】数三角形 题解
- bzoj3505 [Cqoi2014]数三角形 题解
- 【组合】BZOJ3505(Cqoi2014)[数三角形]题解
- [Bzoj3505][Cqoi2014]数三角形
- bzoj3505 [Cqoi2014]数三角形
- bzoj3505: [Cqoi2014]数三角形
- bzoj3505 [Cqoi2014]数三角形
- 【CQOI2014】【BZOJ3505】数三角形
- bzoj3505【CQOI2014】数三角形
- bzoj3505: [Cqoi2014]数三角形
- 【bzoj3505】[Cqoi2014]数三角形
- BZOJ3505[数三角形]
- bzoj3505 [Cqoi2014]数三角形
- bzoj3505 [Cqoi2014]数三角形
- BZOJ3505 [Cqoi2014]数三角形
- 【bzoj3505】 CQOI2014数三角形 数学
- BZOJ3505 [Cqoi2014]数三角形 数学
- [机器学习入门] 李宏毅机器学习笔记-21(Transfer Learning part 1 ; 迁移学习 part 1)
- Oracle 管理优化器的统计信息之系统统计信息 System Statistics
- MVVM架构简单使用
- AndroidGson 解析Json格式的数据
- android window manager
- BZOJ3505 数三角形 题解 【数论】
- Unity exe去掉边框
- 从0开始创建FX3工程之四
- 70. Climbing Stairs
- commons-codec的简易理解
- 前端开发接口联调--用nginx的反向代理机制解决前端跨域问题
- Hive中对数据库,表的操作
- 微信小程序 Node.js (基础九) 函数
- HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)