Picks Theorem 学习笔记

news/2024/10/11 0:32:04

Pick's Theorem 学习笔记

UVA10088 题目传送门

题意:顺时针或逆时针地给出一个 \(n\) 个顶点(顶点都是整点)的简单多边形,求这个多边形内部整点数量(位于多边形形上的整点不算)。

Pick's Theorem

对于一个顶点都是整点的简单多边形:

\(I\) 为多边形内部的整点数量,\(B\) 为多边形形上的整点数量,\(A\) 为多边形面积。有公式:

\[A = I + \dfrac B 2 - 1 \]

比较有用的是它的变形:

\[I = A - \dfrac B 2 + 1 \]

Pick's Theorem 的证明

对于一个 \(B = 3\) 的三角形,其面积 \(A\) 必然为 \(\dfrac 1 2\)

采用数学归纳法的思路:将多边形剖成若干个 \(B=3\) 的三角形,每次切除一个三角形,要么减少一个边上的点,要么将一个内部的点转化为边上的点,直到把多边形切成一个只有两点的线段。

因此 \(A = \dfrac 1 2 (2I + B - 2) = I + \dfrac B 2 - 1\)

Pick's Theorem from Wikipedia

关于 Pick's Theorem

皮克定理有许多有趣的应用,可以看 Matrix67 的这篇文章。

相关练习:P2735 [USACO3.4] 网 Electric Fences

此题解法

利用向量叉积求出多边形面积 \(A\),用一点简单数论求出 \(B\),再用 Pick's Theorem 即可求出 \(I\)

#include <bits/stdc++.h>
#define gcd __gcd
using namespace std;
typedef long long ll;const int MAXN = 1000 + 5;struct Point {ll x, y;Point(ll x, ll y) : x(x), y(y) {}
};
ll cross(Point &a, Point &b) {return a.x * b.y - a.y * b.x;
}int n;
vector<Point> points;int main() { ios::sync_with_stdio(0); cin.tie(0);while (1) {cin >> n;if (n == 0)break;for (int i = 1; i <= n; i++) {int x, y; cin >> x >> y;points.emplace_back(x, y);}points.push_back(points[0]);ll area = 0, edge = 0;for (int i = 1; i <= n; i++) {auto &a = points[i-1], &b = points[i];ll dx = abs(b.x - a.x), dy = abs(b.y - a.y);area += cross(a, b);edge += gcd(dx, dy);}area = abs(area) / 2;cout << area - edge / 2 + 1 << '\n';points.clear();}return 0;
}

参考

  • Pick's Theorem - Art of Problem Solving
  • 图片来自 Pick's theorem - Wikipedia

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/27574.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

DC-9-sudo提权

标签:SQL注入、本地文件包含LFI、端口敲门、hydra爆破、linux提权 0x00 环境准备 下载地址:https://www.vulnhub.com/entry/dc-9,412/ 靶机描述: DC-9 is another purposely built vulnerable lab with the intent of gaining experience in the world of penetration testi…

DC-8-Drupal-exim4提权

Vulnhub简介 Vulnhub是一个提供了很多漏洞环境的靶场平台,其中的环境基本上都是做好的虚拟机镜像文件,需要使用VMware或者是VirtualBox运行。每个镜像会有破解的目标,大多是Boot2root,从启动虚拟机到获取操作系统的root权限和查看flag。 靶场部署 Vulnhub官网:https://www…

DC-5-screen提权

Vulnhub简介 Vulnhub是一个提供了很多漏洞环境的靶场平台,其中的环境基本上都是做好的虚拟机镜像文件,需要使用VMware或者是VirtualBox运行。每个镜像会有破解的目标,大多是Boot2root,从启动虚拟机到获取操作系统的root权限和查看flag。 靶场部署 vulnhub官网:https://www…

洛谷P2375 [NOI2014] 动物园

动物园 题目描述输入格式输出格式输入输出样例 输入 3 aaaaa ab abcababc 输出 36 1 32 开始时都没看出来这是kmp板子题 先看看AC代码吧 #include<bits/stdc++.h> #define ll long long using namespace std; const int maxn=1e6+10; const int mod=1e9+7; char a[maxn];…

List的remove()方法详解

https://blog.csdn.net/anxin_hw/article/details/128312846 一、错误使用场景 1、普通for循环遍历List删除指定元素,list.remove(index) 示例:将姓张的名字移除掉List<String> nameList = new ArrayList<>(Arrays.asList("张三", "李四", &…

软考备考1

【BV1Qc411G7fB】考试形式 考45分就行上午-计算机与软件工程知识-150分钟,笔试,选择题-75分还有5分时专业英语,,一篇文章挖5个空下午-软件设计-150分钟-笔试-简答题-75分三个复习阶段考点理论学习——建立理论框架 题型全覆盖——考试全部题型了然于胸 真题强化训练——适应…

AWVS

工具说明 Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的Web网络漏洞扫描工具,他通过网络爬虫测试你的网站安全,检测流行安全漏洞。 AWVS可以通过SQL注入攻击、XSS(跨站脚本攻击)、目录遍历、代码执行等漏洞来审核Web应用程序的安全性并输出扫描报告。相对于…

树状数组(二维偏序)

题目链接 https://leetcode.cn/problems/maximum-sum-queries/description/ 题目大意题目思路 二维偏序问题 -> 一维排序,一维树状数组! 题目代码 class Solution { public:int sz;vector<int> tr;int lowbit(int x){return x & -x;}void update(int x,int k){f…