• poj1809


    题意:给出一些顶点均为整数坐标,问能构成多少个面积为整数的三角形。给出公式:A=|x1y2 - y1x2 + x2y3 - y2x3 + x3y1 - y3x1|/2

    分析:面积是否为整数只需要看|x1y2 - y1x2 + x2y3 - y2x3 + x3y1 - y3x1|mod2是否为0,所以可以先对每个x,y都mod2,并不影响结果。所以总共有4种点,01,00,10,11。3重循环枚举三角形的3个顶点分别是哪种,并用公式计算其面积是否为整数,若为整数则用组合数学知识,通过每种顶点的个数计算能构成的三角形数。

    View Code
    #include <iostream>
    #include
    <cstdio>
    #include
    <cstdlib>
    #include
    <cstring>
    using namespace std;

    int n;
    long long f[4];

    void input()
    {
    scanf(
    "%d", &n);
    memset(f,
    0, sizeof(f));
    for (int i = 0; i < n; i++)
    {
    int x, y;
    scanf(
    "%d%d", &x, &y);
    f[((x
    & 1) << 1) + (y & 1)]++;
    }
    }

    void work()
    {
    long long ans = 0;
    for (int i = 0; i < 4; i++)
    for (int j = i; j < 4; j++)
    for (int k = j; k < 4; k++)
    {
    int x1 = i >> 1;
    int x2 = j >> 1;
    int x3 = k >> 1;
    int y1 = i & 1;
    int y2 = j & 1;
    int y3 = k & 1;
    if (!((x1 * y2 - y1 * x2 + x2 * y3 - x3 *y2 + x3 * y1 - x1 * y3) & 1))
    {
    if (i == j && j ==k)
    ans
    += f[i] * (f[i] - 1) * (f[i] - 2) / 6;
    else if (i == j)
    ans
    += f[i] * (f[i] - 1) * f[k] / 2;
    else if (j == k)
    ans
    += f[i] * (f[j] - 1) * f[j] / 2;
    else
    ans
    += f[i] * f[j] * f[k];
    }
    }
    printf(
    "%lld\n", ans);
    }

    int main()
    {
    //freopen("t.txt", "r", stdin);
    int t;
    scanf(
    "%d", &t);
    for (int i = 0; i < t; i++)
    {
    printf(
    "Scenario #%d:\n", i + 1);
    input();
    work();
    putchar(
    '\n');
    }
    return 0;
    }
  • 相关阅读:
    gentoo Wireless Configuration
    Gentoo: Chrome
    Gentoo: user's permission
    参考
    GithubPages上部署hexo
    hexo 个人博客搭建
    服务器修改用户名和密码
    CentOS 服务器搭建 mediawiki
    mysql 修复命令日志
    个体如何采用敏捷的工作方式
  • 原文地址:https://www.cnblogs.com/rainydays/p/2138542.html
Copyright © 2020-2023  润新知