首页 > 代码库 > POJ 1265
POJ 1265
主要利用PICK定理与边点数上的GCD的关系求解。
三角形一条边上的所有整数点(包括顶点)可以首先将这条边移到(0, 0)->(x, y)。这时,(x/gcd(x, y), y/gcd(x, y))肯定在这条边上,并且是整数点,其余所有整数点的可以表示为k(x/gcd(x, y), y/gcd(x, y))。所以所有的整数点个数为gcd(x, y) + 1。即:
b = gcd(x, y) + 1
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int MAX=110;struct point { double x,y;}p[MAX];int n;int gcd(int x,int y){ while(y){ int tmp=y; y = x % y; x = tmp; } return x;}int main(){ int t; int cas=0; cin>>t; while(t--){ cas++; cin>>n; double tx,ty; for(int i=0;i<n;i++){ cin>>tx>>ty; if(i==0){ p[i].x=tx; p[i].y=ty; } else{ p[i].x=p[i-1].x+tx; p[i].y=p[i-1].y+ty; } } p[n]=p[0]; double ans=0; for(int i=0;i<n;i++) ans+=(p[i].x*p[i+1].y-p[i].y*p[i+1].x); ans=(ans)/2; int edg=0,in=0; for(int i=0;i<n;i++) edg+=gcd(abs((int)(p[i].x-p[i+1].x)),abs(int(p[i].y-p[i+1].y))); in=(((ans+1)*2-edg)/2); printf("Scenario #%d:\n",cas); printf("%d %d %.1lf\n",in,edg,ans); printf("\n"); } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。