[CQOI2014]数三角形
给定\(n\times m\)的网格,求三个点在其格点上的三角形个数,1<=m,n<=1000。
解
法一:直接
显然为组合计数问题,关键在于划分问题,注意到一个三角形必然会被一个最小的矩形所限制,于是可以以矩形来划分,而现在问题变成对一个矩形内最大的三角形的方案数,显然最大三角形关键在于三角形顶点与矩形顶点之间的关系。
设有一\(a\times b\)矩形,有
1: 三角形有一个顶点在矩形顶点上,有4个矩形顶点可以选择,其余两个三角形顶点可以在剩余两条边自由移动,即\(4\times (a-1)\times (b-1)\)。
2:三角形有两个顶点在矩形同边顶点上,显然可以旋转4次,剩下一个三角顶点可以自由在一条边上移动,即\(2\times(a-1)+2\times(b-1)\)。
3:三角形有两个顶点在矩形对角顶点,此时该点能自由移动,只是不能在对角线上,
引理:对角线上的整点个数为gcd(a,b)+1
证明:
对于对角线上最靠近原点(0,0)的点(x,y),对角线上最靠近(x,y)的点必然是(2x,2y),依次类推,于是我们得知x,y必然是互质的,而取得gcd(a,b)即x,y前的系数,也就是除了原点之外的点,故加1及所需。
不难得知方案数应为\((a\times b-gcd(a,b)-1)\times 2\)
4:三角形有三个顶点在矩形对角顶点,显然讨论3已经包含了这种情况,故无需再考虑。
综上所诉,
\]
\]
枚举计算答案即可。
参考代码:
#include <iostream>
#include <cstdio>
#define il inline
#define ri register
#define ll long long
using namespace std;
il int gcd(int,int);
int main(){
int m,n;
scanf("%d%d",&m,&n);
ri int i,j;ri ll ans(0);
for(i=1;i<=m;++i)
for(j=1;j<=n;++j)
ans+=(ll)(6*i*j-2*gcd(i,j))*(m+1-i)*(n+1-j);
printf("%lld",ans);
return 0;
}
il int gcd(int x,int y){
return x%y?gcd(y,x%y):y;
}
法二:补集
注意到直接做不好做,于是考虑补集,我们能很轻松求出不限制为三角形的方案数,于是我们考虑不是三角形的方案数,显然在一条直线上,于是考虑枚举直线,而这样我们没办法枚举唯一的斜率,这样会导致重复,于是考虑枚举线段,这样就确定了两个端点,另一个点必然在线段内,而方案数由法一的引理不难得出点数,再将该条线段平移加对称操作,枚举减总方案去即可,但是注意竖直和水平的直线,我们得额外减去其方案数。
所以
\]
\]
参考代码:
#include <iostream>
#include <cstdio>
#define il inline
#define ri register
#define ll long long
#define swap(x,y) x^=y^=x^=y
using namespace std;
il int gcd(int,int);
int main(){
int n,m,i,j;ll ans;
scanf("%d%d",&n,&m),ans=(n+1)*(m+1);
ans*=(ans-1)*(ans-2),(ans/=3)/=2;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
ans-=(gcd(i,j)-1)*(n-i+1)*(m-j+1)<<1;
ans-=(n+1)*n*(n-1)/3/2*(ll)(m+1),ans-=(m+1)*m*(m-1)/3/2*(ll)(n+1);
printf("%lld",ans);
return 0;
}
il int gcd(int a,int b){
while(b)swap(a,b),b%=a;return a;
}
[CQOI2014]数三角形的更多相关文章
- BZOJ 3505: [Cqoi2014]数三角形 数学
3505: [Cqoi2014]数三角形 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- Bzoj 3505: [Cqoi2014]数三角形 数论
3505: [Cqoi2014]数三角形 Time Limits: 1000 ms Memory Limits: 524288 KB Detailed Limits Description
- bzoj 3505: [Cqoi2014]数三角形 组合数学
3505: [Cqoi2014]数三角形 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 478 Solved: 293[Submit][Status ...
- BZOJ 3505: [Cqoi2014]数三角形( 组合数 )
先n++, m++ 显然答案就是C(3, n*m) - m*C(3, n) - n*C(3, m) - cnt. 表示在全部点中选出3个的方案减去不合法的, 同一行/列的不合法方案很好求, 对角线的不 ...
- 3505: [Cqoi2014]数三角形
3505: [Cqoi2014]数三角形 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1324 Solved: 807[Submit][Statu ...
- BZOJ 3505: [Cqoi2014]数三角形 [组合计数]
3505: [Cqoi2014]数三角形 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个. 注意三角形的三点不能共线. 1<=m,n<=1000 $n++ m++$ $ans ...
- bzoj3505 / P3166 [CQOI2014]数三角形
P3166 [CQOI2014]数三角形 前置知识:某两个点$(x_{1},,y_{1}),(x_{2},y_{2})\quad (x_{1}<x_{2},y_{1}<y_{2})$所连成 ...
- BZOJ 3505 [Cqoi2014]数三角形
3505: [Cqoi2014]数三角形 Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形.注意三角形的三点不能共线. Input ...
- 【BZOJ3505】[Cqoi2014]数三角形 组合数
[BZOJ3505][Cqoi2014]数三角形 Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. ...
随机推荐
- 取模性质,快速幂,快速乘,gcd和最小公倍数
一.取模运算 取模(取余)运算法则: 1. (a+b)%p=(a%p+b%p)%p; 2.(a-b)%p=(a%p-b%p)%p; 3.(a*b)%p=(a%p * b%p)%p; 4.(a^b)%p ...
- nginx----------前端写了一套带有vue路由的的功能。放到nginx配置的目录下以后,刷新会报404未找到。
1. 这是根据实际情况来写的. location /h5/activity/wechat/ { index index.html index.htm index.php; ...
- 北京大学Cousera学习笔记--5-计算导论与C语言基础--计算机的基本原理-设计程序
只要你认真的思考,你就会发现这个世界是如此的简单,正如我们想象的一样,正因为如此,我们的思考才更加的有价值 1.单词:关键字(有特定含义的):其他词用关键字定义出来 2.数和计算符号:数据类型+运算符 ...
- debian9升级安装到python3.6和pip3.6
安装步骤 1.添加testing源 vim /etc/apt/sources.list deb http://mirrors.163.com/debian/ testing main 2.更新源 ap ...
- Django框架详细介绍---认证系统
在web开发中通常设计网站的登录认证.注册等功能,Django恰好内置了功能完善的用户认证系统 1.auth模块 from django.contrib import auth 模块源码 import ...
- WCF 基础框架
WCF 基础框架: 1,契约:契约书一语个服务公共接口的一部分,一个服务的契约定义了服务端公开的方法,使用的传递协议,可访问的地址,传输的消息格式等内容,主要包括数据契约,消息契约,服务契约等. 2, ...
- VS 通过局域网访问调试状态下的web应用程序
1.点击vs的启动按钮 2.在任务栏找到IIS Express的图标,点击“显示所有应用程序” 3.如果只有本地localhost访问方式,点击对应应用程序的本地URL,就会显示对应的配置文件 4.点 ...
- 使用 dom4j 处理 xml (2)
记录一些 xpath 的常规用法,备忘. //3.XPath 了解(用于在xml中选取元素,类似 jquery 选择器) //3.1 路径 Node node1 = root.selectSingle ...
- laravel blog edit
模板复制create的模板 主要修改的地方 <form action="{{ url('admin/article/'.$article->id) }}" method ...
- python小知识点随笔
可能会有不局限于Python语言的内容,文中“>>>”表示结果,而不是命令行交互的提示符 1.关于字符串编码 ASCII编码 占用一个字节 二进制11111111=十进制255 所以 ...