博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 12075 - Counting Triangles(容斥原理计数)
阅读量:5283 次
发布时间:2019-06-14

本文共 1106 字,大约阅读时间需要 3 分钟。

题目链接:

题意:求n * m矩形内,最多能组成几个三角形
这题和UVA 1393类似,把总情况扣去三点共线情况,那么问题转化为求三点共线的情况,对于两点,求他们的gcd - 1,得到的就是他们之间有多少个点,那么情况数就能够求了,然后还是利用容斥原理去计数,然后累加出答案
代码:
#include 
#include
#include
using namespace std;const int N = 1005;long long n, m, dp[N][N];int cas;long long gcd(long long a, long long b) { if (b == 0) return a; return gcd(b, a % b);}void init() { cas = 0; for (int i = 2; i <= 1000; i++) for (int j = 2; j <= 1000; j++) dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + gcd(i, j) - 1; for (int i = 2; i <= 1000; i++) for (int j = 2; j <= 1000; j++) dp[i][j] += dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1];}long long C(long long n, long long m) { if (m > n) return 0; m = min(m, n - m); long long ans = 1; for (long long i = 0; i < m; i++) ans = ans * (n - i) / (i + 1); return ans;}int main() { init(); while (~scanf("%lld%lld", &n, &m) && n || m) { n++; m++; printf("Case %d: %lld\n", ++cas, C(n * m, 3) - n * C(m, 3) - m * C(n, 3) - dp[n - 1][m - 1] * 2); } return 0;}

转载于:https://www.cnblogs.com/hrhguanli/p/3896724.html

你可能感兴趣的文章
模板设计模式的应用
查看>>
实训第五天
查看>>
平台维护流程
查看>>
2012暑期川西旅游之总结
查看>>
12010 解密QQ号(队列)
查看>>
2014年辛星完全解读Javascript第一节
查看>>
装配SpringBean(一)--依赖注入
查看>>
java选择文件时提供图像缩略图[转]
查看>>
方维分享系统二次开发, 给评论、主题、回复、活动 加审核的功能
查看>>
Matlab parfor-loop并行运算
查看>>
string与stringbuilder的区别
查看>>
2012-01-12 16:01 hibernate注解以及简单实例
查看>>
iOS8统一的系统提示控件——UIAlertController
查看>>
PAT甲级——1101 Quick Sort (快速排序)
查看>>
python创建进程的两种方式
查看>>
1.2 基础知识——关于猪皮(GP,Generic Practice)
查看>>
迭代器Iterator
查看>>
java易错题----静态方法的调用
查看>>
php建立MySQL数据表
查看>>
最简单的线程同步的例子
查看>>