题意:
网格图上有n个点,不存在三点共线的情况,求面积为整数,内部点的个数为奇数的三角形个数。

Solution

简单的版本我做出来了,但是难的还差一点,主要是有几个性质没有发现。观摩大佬的做法,结合自己的理解写了一下题解。

这道题其实就是一道找性质的题,我们很容易联想到皮克定理,即S=a+b2+1S=a+\frac{b}{2}+1S=a+2b​+1。

这样就能够把求内部的点转化成求边上的点。

然后我们在联系两个公式,一个是S=∣x1∗y2−x2∗y1∣2S=\frac{|x1*y2-x2*y1|}{2}S=2∣x1∗y2−x2∗y1∣​,另外一个是b=gcd(∣x1∣,∣y1∣)+gcd(∣x2∣,∣y2∣)+gcd(∣x1−x2∣,∣y1−y2∣)b=gcd(|x1|,|y1|)+gcd(|x2|,|y2|)+gcd(|x1-x2|,|y1-y2|)b=gcd(∣x1∣,∣y1∣)+gcd(∣x2∣,∣y2∣)+gcd(∣x1−x2∣,∣y1−y2∣)。我们把连接点(x1,y1)(x1,y1)(x1,y1)和点(x2,y2)(x2,y2)(x2,y2)的边的长度设为gcd(∣x1−x2∣,∣y1−y2∣)gcd(|x1-x2|,|y1-y2|)gcd(∣x1−x2∣,∣y1−y2∣)。

接下来,我们把两个公式都代入进去并化简,得:
∣x1∗y2−x2∗y1∣=2∗(a−1)+gcd(∣x1∣,∣y1∣)+gcd(∣x2∣,∣y2∣)+gcd(∣x1−x2∣,∣y1−y2∣)|x1*y2-x2*y1|=2*(a-1)+gcd(|x1|,|y1|)+gcd(|x2|,|y2|)+gcd(|x1-x2|,|y1-y2|)∣x1∗y2−x2∗y1∣=2∗(a−1)+gcd(∣x1∣,∣y1∣)+gcd(∣x2∣,∣y2∣)+gcd(∣x1−x2∣,∣y1−y2∣)

因为aaa是奇数,所以可以把式子变成这样:

∣x1∗y2−x2∗y1∣≡gcd(∣x1∣,∣y1∣)+gcd(∣x2∣,∣y2∣)+gcd(∣x1−x2∣,∣y1−y2∣)(mod4)|x1*y2-x2*y1|\equiv gcd(|x1|,|y1|)+gcd(|x2|,|y2|)+gcd(|x1-x2|,|y1-y2|) \pmod{4}∣x1∗y2−x2∗y1∣≡gcd(∣x1∣,∣y1∣)+gcd(∣x2∣,∣y2∣)+gcd(∣x1−x2∣,∣y1−y2∣)(mod4)

到这里又要用到一个性质:因为bbb是偶数,所以三角形的三边的长度要么是偶偶偶,要么是偶奇奇。

直接令gcd(∣x1−x2∣,∣y1−y2∣)gcd(|x1-x2|,|y1-y2|)gcd(∣x1−x2∣,∣y1−y2∣)为偶数,两种情况要分开统计。

到这里又要有一个性质:如果xxx,yyy是偶数,则有gcd(x,y)mod4=gcd(xmod4,ymod4)gcd(x,y)\mod4=gcd(x\mod4,y\mod4)gcd(x,y)mod4=gcd(xmod4,ymod4)这个性质很容易推,就不证明了。

然后继续想,可以发现,如果点(x1,y1)(x1,y1)(x1,y1),(x2,y2)(x2,y2)(x2,y2),如果x1≡x2,y1≡y2,gcd(x1,y1)≡gcd(x2,y2)(mod4)x1\equiv x2,y1\equiv y2,gcd(x1,y1)\equiv gcd(x2,y2) \pmod{4}x1≡x2,y1≡y2,gcd(x1,y1)≡gcd(x2,y2)(mod4),那么这两个点在统计的时候效果是一样的。(注:这里默认以原点为三角形的一点)

所以我们枚举一个点iii,用cnt[x][y][z]cnt[x][y][z]cnt[x][y][z]来记录x1≡x,y1≡y,gcd(x1,y1)≡z(mod4)x1\equiv x,y1\equiv y,gcd(x1,y1)\equiv z \pmod{4}x1≡x,y1≡y,gcd(x1,y1)≡z(mod4)的点的个数。然后暴力枚举统计,要注意重复的问题。

Code

#include<bits/stdc++.h>
#define ll long long
#define gc getchar
#define pc putchar
#define pii pair<int,int>
#define mp make_pair
#define fi first
#define se second
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define dwn(i,x,y) for(int i=x;i>=y;i--)
#define mst(a,b) memset(a,b,sizeof(a))
#define mod 1000000007
using namespace std;
template<typename T>inline void qr(T &x){x=0;int f=0;char s=gc();while(s<'0'||'9'<s)f|=s=='-',s=gc();while('0'<=s&&s<='9')x=x*10+s-48,s=gc();x=f?-x:x;
}
int cc=0,buf[31];
template<typename T>inline void qw(T x){if(x<0)putchar('-'),x=-x;do{buf[++cc]=int(x%10);x/=10;}while(x);while(cc)pc(buf[cc--]+'0');puts("");
}
int ad(int x,int y){return (x+y)>=mod?x+y-mod:x+y;}
int mu(int x,int y){return 1ll*x*y%mod;}
int de(int x,int y){return (x-y)<0?x-y+mod:x-y;}
void mymin(int &x,int y){x=x<y?x:y;}
void mymax(int &x,int y){x=x>y?x:y;}
const int N=6e3+10;
int n,x[N],y[N],cnt[4][4][4];
int S2(int x1,int y1,int x2,int y2){int res=x1*y2-x2*y1;res%=4;if(res<0)res+=4;return res;
}
int gcd(int a,int b){return !b?a:gcd(b,a%b);}
int main(){qr(n);rep(i,1,n)qr(x[i]),qr(y[i]);ll eee=0,eoo=0;rep(i,1,n){mst(cnt,0);rep(j,1,n)if(i!=j)cnt[x[j]%4][y[j]%4][gcd(abs(x[i]-x[j]),abs(y[i]-y[j]))%4]++;rep(x1,0,3)rep(y1,0,3)rep(b1,0,3){int kk=cnt[x1][y1][b1];cnt[x1][y1][b1]--;for(int x2=x1&1;x2<4;x2+=2)for(int y2=y1&1;y2<4;y2+=2)for(int b2=b1&1;b2<4;b2+=2){int S=S2(x1-x[i],y1-y[i],x2-x[i],y2-y[i])>>1;int b3=gcd(abs(x1-x2),abs(y1-y2));int res=S-(b1+b2+b3)/2+1;if(res&1){if(b1&1)eoo+=kk*cnt[x2][y2][b2];else eee+=kk*cnt[x2][y2][b2];}}cnt[x1][y1][b1]++;}}qw(eee/6+eoo/2);return 0;
}

CF1548D2 Gregor and the Odd Cows (Hard)相关推荐

  1. CodeForces - 1549F1 Gregor and the Odd Cows (Easy)(几何+数论)

    题目链接:点击查看 题目大意:给出二维平面上的 nnn 个点,任意选择出三个点可以构成一个三角形,现在问满足下面条件的三角形的个数: 三角形面积为整数 三角形包含的(不包括边界)整数点为奇数 其中所有 ...

  2. Codeforces Round #736 (Div. 1Div2)

    Codeforces Round #736 (Div2) Codeforces Round #736 (Div. 1) 题号 题目 难度 A Gregor and Cryptography 签到 B ...

  3. Milking Cows 挤牛奶

    1.2.1 Milking Cows 挤牛奶 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 554  Solved: 108 [Submit][Stat ...

  4. 二分搜索 POJ 2456 Aggressive cows

    题目传送门 1 /* 2 二分搜索:搜索安排最近牛的距离不小于d 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #incl ...

  5. POJ 2456 Aggressive cows(二分答案)

    Aggressive cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22674 Accepted: 10636 Des ...

  6. 洛谷——P2341 [HAOI2006]受欢迎的牛//POJ2186:Popular Cows

    P2341 [HAOI2006]受欢迎的牛/POJ2186:Popular Cows 题目背景 本题测试数据已修复. 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所 ...

  7. [USACO16JAN]Angry Cows S[二分+贪心]

    题意:Bessie 设计了一款新游戏:Angry Cows.在这个游戏中,玩家发射奶牛,每头奶牛落地时引爆一定范围内的干草.游戏的目标是使用一组奶牛引爆所有干草. N 捆干草排列在数轴上的不同位置.第 ...

  8. A - Til the Cows Come Home POJ - 2387

    A - Til the Cows Come Home POJ - 2387 最短路 #include<iostream> #include<cstdio> #include&l ...

  9. bzoj1669[Usaco2006 Oct]Hungry Cows饥饿的奶牛*

    bzoj1669[Usaco2006 Oct]Hungry Cows饥饿的奶牛 题意: 求最长单调递增子序列,序列大小≤5000 题解: 蒟蒻弱写了一个O(n^2)的. 代码: 1 #include ...

最新文章

  1. div.php织梦自定义表判断不能为空,织梦自定义表单字段为必填项的教程
  2. 开源wkhtmltopdf使用心得 (一)
  3. OpenCV计算机视觉编程攻略之用色调、饱和度和亮度表示颜色
  4. android 中的常用组件
  5. [密码学] 消息认证码基础
  6. c语言中 字符串常量的界定符,C字符串操作函数
  7. 2019春季暑期实习生正式批招聘笔试【腾讯】(回忆版)第二题
  8. html制作固定列的表格,带固定列的简单HTML表格
  9. C语言家谱管理程序,课内资源 - 基于C语言实现的家谱管理系统
  10. (转)mysql查看连接客户端ip和杀死进程
  11. android开不了机怎么办手机号码,手机开不了机怎么办 原因分析及其解决方法
  12. oracle 10g的闪回删除与回收站
  13. 我的世界java版联机不稳定_我的世界:你一定不会相信,时隔2年,网易这次真的“更新”了...
  14. c++ error函数_回调函数地狱
  15. 使用ES6的Promis完美解决ajax的回调(优化代码)
  16. json文件简介及借助于python解析json文件
  17. linux大容量硬盘 克隆到小硬盘_clonezilla 不管用了,手动把 GPT 分区的 ubuntu14.04 从大硬盘克隆到小硬盘...
  18. Python 实现端口扫描器
  19. Win7笔记本开启WiFi
  20. 医疗电子平台选择:FPGA、ARM、X86、DSP还是GPU

热门文章

  1. FPGA的复位设计要醒目点啦
  2. 职业能力测试试题及答案
  3. ros C++ msg功能包
  4. 零基础转行IT学习什么好?
  5. 系统架构设计师教程-学习-记录(1)系统架构师知识结构
  6. xp如何配置信息服务器地址,xp如何配置信息服务器地址
  7. Linux主机IP地址:网络信息不可用
  8. GitChat 最火 Chat 文章合集 | 春节特别版
  9. 邮件英语最常用的100个句型
  10. Java和Python,哪个更适合开发AI人工智能?