codeforces 372E. Drawing Circles is Fun
tags:[圆の反演][乘法原理][尺取法]
题解:
圆の反演:将过O点的圆,映射成不过O的直线,相切的圆反演出来的直线平行。
我们将集合S中的点做反演变换:(x,y)->(x/(x^2+y^2), y/(x^2+y^2))
若OAB的外接圆与OCD的外接圆相切&&OAC外接圆与OBD外接圆相切。
那么反演后就有:A'B'//C'D' && A'C'//B'D'即A'B'C'D'为平行四边形
枚举所有的对角线,对于每一根对角线,我们记录下它的斜率,中点坐标。
对这些对角线排序后,使用尺取法&乘法原理即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
const int MOD = 1000000000 + 7;
const int NICO = 1000 + 10;
int n, tot, ans;
double a,b,c,d,x,y;
struct Point
{
double x, y;
} p[NICO];
struct Mid
{
double x, y, k;
} mid[NICO*NICO];
bool equal(double x, double y)
{
return abs(x-y) < 1e-9;
}
bool cmp(Mid a, Mid b) //对所有对角线按中点横坐标,中点纵坐标,斜率三个关键字排序。
{
if(equal(a.x, b.x))
{
if(equal(a.y,b.y))
{
return a.k < b.k;
}
return a.y < b.y;
}
return a.x < b.x;
}
void read()
{
scanf("%d", &n);
for(int i=1;i<=n;i++)
{
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
x = a/b;
y = c/d;
p[i].x = x / (x*x + y*y); // 对所有点进行反演
p[i].y = y / (x*x + y*y);
}
}
void init() //求出对角线中点横坐标,中点纵坐标,斜率
{
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
mid[++tot].x = p[i].x + p[j].x;
mid[tot].y = p[i].y + p[j].y;
if(equal(p[i].x, p[j].x))
{
mid[tot].k = 1e9;
} else {
mid[tot].k = (p[j].y - p[i].y) / (p[j].x - p[i].x);
}
}
}
}
void solve()
{
sort(mid+1,mid+1+tot,cmp);
int i, j;
for(i=1;i<=tot;i=j) // 尺取法。
{
int cnt = 1; LL res = 1;
// 如果第j条线段中点的坐标与第i条线段中点的坐标不同,则跳出第二层循环。
for(j=i+1;j<=tot && equal(mid[j].x ,mid[i].x) && equal(mid[j].y, mid[i].y);j++)
{
if(equal(mid[j].k,mid[j-1].k)) cnt ++; // x,y,k皆相等!志同道合!
else res = res*(cnt+1)%MOD, cnt = 1; // 计数君阵亡!根据乘法原理,这些对角线有(cnt+1)种取法。
}
res = res * (cnt+1) % MOD;
ans = (ans + res - 1) % MOD;// 一根线段都不拿,会翻车!减掉!
}
printf("%d\n", ans - tot); // 只拿一根,会翻车!减掉!
}
int main()
{
read();
init();
solve();
}
codeforces 372E. Drawing Circles is Fun的更多相关文章
- HTML5资料
1 Canvas教程 <canvas>是一个新的用于通过脚本(通常是JavaScript)绘图的HTML元素.例如,他可以用于绘图.制作图片的组合或者简单的动画(当然并不那么简单).It ...
- Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 1) C. Bear and Drawing
题目链接:http://codeforces.com/contest/573/problem/C题目大意:在两行无限长的点列上面画n个点以及n-1条边使得构成一棵树,并且要求边都在同一平面上且除了节点 ...
- codeforces D. Area of Two Circles' Intersection 计算几何
D. Area of Two Circles' Intersection time limit per test 2 seconds memory limit per test 256 megabyt ...
- codeforces 573C Bear and Drawing
Limak is a little bear who learns to draw. People usually start with houses, fences and flowers but ...
- codeforces 600D Area of Two Circles' Intersection
分相离,内含,想交三种情况讨论一下. 主要是精度和数据范围的问题,首先数据用long double,能用整型判断就不要用浮点型. 题目中所给的坐标,半径是整型的,出现卡浮点判断的情况还是比较少的. 最 ...
- Codeforces 1015E1 Stars Drawing (Easy Edition)
题面: 传送门 题目描述: 要求用十字星星来画题目给出的"星"图.如果不能用十字星星来画"星"图,输出-1:如果能,则输出要在图的哪个位置画相应大小的十字星图. ...
- Codeforces Round #356 (Div. 2)-B
B. Bear and Finding Criminals 链接:http://codeforces.com/contest/680/problem/B There are n cities in B ...
- CodeForces 164 B. Ancient Berland Hieroglyphs 单调队列
B. Ancient Berland Hieroglyphs 题目连接: http://codeforces.com/problemset/problem/164/B Descriptionww.co ...
- Codeforces Round #290 (Div. 2) A. Fox And Snake 水题
A. Fox And Snake 题目连接: http://codeforces.com/contest/510/problem/A Description Fox Ciel starts to le ...
随机推荐
- 原生js实现轮播图
原生js实现轮播图 很多网站上都有轮播图,但找到一个系统讲解的却很难,因此这里做一个简单的介绍,希望大家都能有所收获,如果有哪些不正确的地方,希望大家可以指出. 原理: 将一些图片在一行中平铺,然后计 ...
- jenkins coding.net webhook plugin
开源地址: https://github.com/yuzd/coding.net =========================================================== ...
- 读书笔记 effctive c++ Item 20 优先使用按const-引用传递(by-reference-to-const)而不是按值传递(by value)
1. 按值传递参数会有效率问题 默认情况下,C++向函数传入或者从函数传出对象都是按值传递(pass by value)(从C继承过来的典型特性).除非你指定其他方式,函数参数会用实际参数值的拷贝进行 ...
- 201521123014 java第一周总结
201521123014 java第一周总结 1.本周学习总结 刚认识这一门新语言,我就充满了好奇心,想看看Java和学过C语言,C++有什么区别.在这一周的学习中,我认识到,对于初学者而言,Java ...
- XHTML表格
1.基本格式: <table> <tr> <th>A</th><th>B</th><th>C</th>& ...
- vpn服务搭建
先安装pptpd服务,就是VPN连接的软件模块. 输入:yum install ppp iptables pptpd 安装完成之后 A:编辑pptpd.conf: 输入:vim /etc/pptpd. ...
- 数据库读写分离Amoeba
1.理解读写分离的原理 Amoeba(变形虫)项目,该开源框架于2008发布一款Amoeba for mysql软件,该软件致力于mysql的分布式数据库前端代理层,主要的作用是应用服务访问mysql ...
- HTML文档中使用JavaScript和css
HTML文档中使用JavaScript和css 引入css 内嵌式引入:将css代码写在HTML中的style标签里面 <!DOCTYPE html> <html> <h ...
- JavaScript技巧总结和本地存储(一)
类型检测 typeof 一般用于js的基本数据类型(undefined,number,string,boolean.注意null检测的结构是object)检测,引用类型检测不准确. instanceo ...
- 设置debian的静态IP
欲设置的信息: IP地址:198.9.146.131 子网掩码:255.255.255.0 网关:198.9.146.254 DNS:198.9.9.1 198.9.9.2 首先编辑/etc/netw ...