码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1265

时间:2014-08-09 21:12:19      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:blog   os   io   for   ar   div   log   ios   

主要利用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;
}

  

POJ 1265,布布扣,bubuko.com

POJ 1265

标签:blog   os   io   for   ar   div   log   ios   

原文地址:http://www.cnblogs.com/jie-dcai/p/3901507.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!