bzoj 3505 数三角形 - 组合数学
给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个。下图为4x4的网格上的一个三角形。
注意三角形的三点不能共线。
Input
输入一行,包含两个空格分隔的正整数m和n。
Output
输出一个正整数,为所求三角形数量。
Sample Input
2 2
Sample Output
76
Hint
数据范围
1<=m,n<=1000
不难得到一个思路。最终的答案 = 任选3点的方案数 - 三点共线的方案数。
前者很好求直接组合数就好了。后者可以枚举线段两端点,然后计算第三个点在这个线段上(不含端点)的方案数,这要用到在网格图中一个神奇的结论,两个格点点的连线穿过的格点数等于这两点的横纵坐标之差的最大公约数减一,至于它的证明可以用相似再加一点数论的东西。但是枚举任意两点会超时。但发现很多地方其实这个横纵坐标的差是相等的,所以直接枚举这个横纵坐标之差,然后乘法乘一乘就好了。
Code
/**
* bzoj
* Problem#3505
* Accepted
* Time:344ms
* Memory:1288k
*/
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<fstream>
#include<sstream>
#include<algorithm>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<vector>
#include<stack>
#ifndef WIN32
#define Auto "%lld"
#else
#define Auto "%I64d"
#endif
using namespace std;
typedef bool boolean;
const signed int inf = (signed)((1u << ) - );
#define smin(a, b) a = min(a, b)
#define smax(a, b) a = max(a, b)
#define max3(a, b, c) max(a, max(b, c))
#define min3(a, b, c) min(a, min(b, c))
template<typename T>
inline boolean readInteger(T& u){
char x;
int aFlag = ;
while(!isdigit((x = getchar())) && x != '-' && x != -);
if(x == -) {
ungetc(x, stdin);
return false;
}
if(x == '-'){
x = getchar();
aFlag = -;
}
for(u = x - ''; isdigit((x = getchar())); u = (u << ) + (u << ) + x - '');
ungetc(x, stdin);
u *= aFlag;
return true;
} template<typename T>
T gcd(T a, T b) {
if(!b) return a;
return gcd(b, a % b);
} int n, m;
int pro;
long long res; inline void init() {
readInteger(n);
readInteger(m);
pro = (n + ) * (m + );
res = pro * 1LL * (pro - ) * (pro - ) / ;
} inline void solve() {
for(int i = ; i <= n; i++) {
for(int j = ; j <= m; j++) {
if(i == && j == ) continue;
long long t = (gcd(i, j) - 1LL) * (n - i + ) * (m - j + );
if(!i || !j) res -= t;
else res -= (t << );
}
}
printf(Auto, res);
} int main() {
init();
solve();
return ;
}
bzoj 3505 数三角形 - 组合数学的更多相关文章
- bzoj 3505: [Cqoi2014]数三角形 组合数学
3505: [Cqoi2014]数三角形 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 478 Solved: 293[Submit][Status ...
- [BZOJ][CQOI2014]数三角形
Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正整数m和 ...
- Luogu P3166 [CQOI2014]数三角形 组合数学
好题鸭.. 不好直接求三角形个数,那就用全集-补集,转化为求三点共线的数量. 具体求法是求出水平共线数量与竖直共线数量和斜线共线数量. 用排列组合的知识可知为水平和竖直的为$C_n^3$与$C_m^ ...
- 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]数三角形( 组合数 )
先n++, m++ 显然答案就是C(3, n*m) - m*C(3, n) - n*C(3, m) - cnt. 表示在全部点中选出3个的方案减去不合法的, 同一行/列的不合法方案很好求, 对角线的不 ...
- BZOJ 3505: [Cqoi2014]数三角形 [组合计数]
3505: [Cqoi2014]数三角形 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个. 注意三角形的三点不能共线. 1<=m,n<=1000 $n++ m++$ $ans ...
- BZOJ 3505 [Cqoi2014]数三角形
3505: [Cqoi2014]数三角形 Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形.注意三角形的三点不能共线. Input ...
- [CQOI2014]数三角形 题解(组合数学+容斥)
[CQOI2014]数三角形 题解(数论+容斥) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1328780 链接题目地址:洛谷P3166 BZOJ 350 ...
随机推荐
- consul Consul vs. ZooKeeper, doozerd, etcd
小结 1.Consul 功能更丰富: 2. 暴露http接口避免暴露系统复杂性 The Consul clients expose a simple HTTP interface and avoid ...
- 伪列ROWNUM、ROWID部分用法
ROWNUM是逻辑值,不可以参与计算 ROWID是物理值,可以参与计算 在ROWNUM和ROWID使用中,现将查找结果形成一个结果集 在结果集中给ROWID 和ROWNUM别名,在外层中使用这个别名找 ...
- 添加用户username到sudo组
添加用户username到sudo组: usermod -aG sudo username USERMOD(8) 系统管理命令 USERMOD(8) 名 usermod - 修改一个用户账户 大 us ...
- pandas介绍及环境部署
pandas介绍 Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的.Pandas 纳入了大量库和一些标准的 ...
- Chrome百度不显示中文字体
chrome://flags/ 启用DirectWrite 关闭就可以了
- [解决]WPF 在 win7 系统无法运行:FileNotFoundException
开发环境:VS2015 + .NET 4.6.2 开发项目1:WPF + CefSharp 开发项目2:WPF 情况:两个项目编译的程序都无法在客户环境的 win7上运行,事件查看器中如下日志: Th ...
- requests库的post请求
requests库的post请求 #coding:utf-8 import requests import json class Trans(object): def __init__(self, w ...
- mysql 权限管理 revoke 回收权限 命令
回收所有库,所有表的所有权限 revoke all on *.* from 针对mike的账号 回收 所有库,所有表的select权限 mysql> revoke select on *.* f ...
- zookeeper java调用及权限控制
import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.util.ArrayLis ...
- NYOJ 47
思路: 在n>3的时候就用前两个小的来带后两个大的,有两种方式(一就是1,2先过,然后1回来,然后n,n-1过,然后2,回来),(二就是 1,n先过去 然后1回来,然后 1,n-1过去吗.,然后 ...