记录编号 344101 评测结果 AAAAAAAAAA
题目名称 妹妹的饼干 最终得分 100
用户昵称 Gravatarsxysxy 是否通过 通过
代码语言 C++ 运行时间 0.027 s
提交时间 2016-11-09 21:13:18 内存使用 0.21 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <cstdarg>
#include <list>
#include <queue>
#include <algorithm>
#include <vector>
#include <cstring>
#include <string>
#include <cmath>
using namespace std;
typedef long long LL;
//百度了一波皮克公式又聆听AntiLeaf大神犇的教诲,gcd一下得到线段上点的数量
struct point
{
    LL x, y;
}ps[1002];
LL cross(point &a, point &b)
{
    return a.x*b.y - b.x*a.y;
}
LL area(point v[], int n)
{
    LL c = 0;
    for(int i = 1; i < n; i++)c += cross(v[i], v[i+1]);
    c += cross(v[n], v[1]);
    return abs(c);
}
LL gcd(LL a, LL b)
{
    return b?gcd(b, a%b):a;
}
int main()
{
    freopen("sistercookies.in", "r", stdin);
    freopen("sistercookies.out", "w", stdout);
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)scanf("%lld %lld", &ps[i].x, &ps[i].y);
    LL ans = area(ps, n);
    for(int i = 1; i < n; i++)
        ans -= gcd(abs(ps[i].x-ps[i+1].x), abs(ps[i].y-ps[i+1].y));
    ans -= gcd(abs(ps[1].x-ps[n].x), abs(ps[1].y-ps[n].y));
    printf("%lld\n", (ans>>1)+1);
    return 0;
}