[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的网格上的一个三角形. 注意三角形的三点不能共线. ...
随机推荐
- Cocos2dx Android环境编译出错:jni/Android.mk: Cannot find module with tag 'scripting/lua-bindings' in import path
解决方案为: 在项目proj.android\jni\Android.mk(D:\my_lua_test2\MyluaTest\frameworks\runtime-src\proj.android\ ...
- 关于Oracle的44951事件
最近有同事遇到某客户数据库产生大量阻塞,等待事件为:enq HW - contention,最开始采用不断杀会话的方式,效果不好,问题一直高频反复.进一步确认SQL是大量的insert,且插入的表中含 ...
- NetCore2.0下使用EF CodeFirst创建数据库
本文所使用的VS版本:VS2017 15.3.0 首先新建一个.net core项目 取名NetCoreTask 使用模型视图控制器方式 新建Model层 在Model层下新建一个user实体类 1 ...
- pydemo_testMaopuSpider
import json from multiprocessing import Pool import requests from requests.exceptions import Request ...
- pandas nan值处理
创建DataFrame样例数据 >>> import pandas as pd >>> import numpy as np >>> data = ...
- 2.3JAVA基础复习——JAVA语言的基础组成函数
JAVA语言的基础组成有: 1.关键字:被赋予特殊含义的单词. 2.标识符:用来标识的符号. 3.注释:用来注释说明程序的文字. 4.常量和变量:内存存储区域的表示. 5.运算符:程序中用来运算的符号 ...
- 让策划也能轻松修改数据的方法:运用Excel2Json2Object插件将xml表格转为Object导入脚本
让策划也能轻松修改数据的方法:运用Excel2Json2Object插件将xml表格转为Object导入脚本 运用Excel2Json2Object插件将xml表格转为Object导入脚本 下载地址 ...
- GTID 跳过事物
Mysql5.7 stop slave; set @@SESSION.GTID_NEXT='507e80e9-3648-11e9-aa70-fa163e77a52d:20173'; begin; co ...
- 010 Editor Mac安装教程
010 Editor mac版是mac上一款非常强大的十六进制编辑器,可以帮助用户进行编辑十六进制和二进制,可选择自己需要的进制进行编辑,还可对任何的文件进行编辑:软件内置了强大的模块.脚本操作,只需 ...
- shell脚本-工作练习篇
瞎扯时间 人的惰性真的很难去戒掉,每天工作下班回家后,只想瘫倒在床上,玩玩手游,刷刷抖音,甚至看看无聊至极的“爽文”,对于学习.看书啥的,完全提不起兴趣,也许正是因为如此,我才显得这么平庸而无趣吧. ...