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的更多相关文章

  1. HTML5资料

    1 Canvas教程 <canvas>是一个新的用于通过脚本(通常是JavaScript)绘图的HTML元素.例如,他可以用于绘图.制作图片的组合或者简单的动画(当然并不那么简单).It ...

  2. Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 1) C. Bear and Drawing

    题目链接:http://codeforces.com/contest/573/problem/C题目大意:在两行无限长的点列上面画n个点以及n-1条边使得构成一棵树,并且要求边都在同一平面上且除了节点 ...

  3. 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 ...

  4. codeforces 573C Bear and Drawing

    Limak is a little bear who learns to draw. People usually start with houses, fences and flowers but ...

  5. codeforces 600D Area of Two Circles' Intersection

    分相离,内含,想交三种情况讨论一下. 主要是精度和数据范围的问题,首先数据用long double,能用整型判断就不要用浮点型. 题目中所给的坐标,半径是整型的,出现卡浮点判断的情况还是比较少的. 最 ...

  6. Codeforces 1015E1 Stars Drawing (Easy Edition)

    题面: 传送门 题目描述: 要求用十字星星来画题目给出的"星"图.如果不能用十字星星来画"星"图,输出-1:如果能,则输出要在图的哪个位置画相应大小的十字星图. ...

  7. Codeforces Round #356 (Div. 2)-B

    B. Bear and Finding Criminals 链接:http://codeforces.com/contest/680/problem/B There are n cities in B ...

  8. CodeForces 164 B. Ancient Berland Hieroglyphs 单调队列

    B. Ancient Berland Hieroglyphs 题目连接: http://codeforces.com/problemset/problem/164/B Descriptionww.co ...

  9. 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 ...

随机推荐

  1. 读书笔记 effective c++ Item 17 使用单独语句将new出来的对象放入智能指针

    1. 可能会出现资源泄漏的一种用法 假设我们有一个获取进程优先权的函数,还有一个在动态分类的Widget对象上根据进程优先权进行一些操作的函数: int priority(); void proces ...

  2. Debug和Release区别

    VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步 ...

  3. BZOJ 1096: [ZJOI2007]仓库建设(动态规划+斜率优化)

    第一次写斜率优化,发现其实也没啥难的,没打过就随便找了一份代码借(chao)鉴(xi)下,不要介意= = 题解实在是懒得写了,贴代码吧= = CODE: #include<cstdio># ...

  4. MONO 如何打包 .NET程序独立运行(winform篇)

    .NET程序独立运行是指运行.NET的电脑上,不需要安装.NET框架. .NET程序集“独立运行”并非真正的独立,它是运行在mono运行时基础之上的.由于这个运行时可以独立存在,所以,我们不需要在目标 ...

  5. js中窗口大小和单个元素大小的计算

    1. 窗口的大小即浏览器的大小: window.innerWidth, window.innerHeight, window.outerHeight, window.outerWidth 在IE9+, ...

  6. [bzoj3196]Tyvj 1730 二逼平衡树——线段树套平衡树

    题目 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查 ...

  7. Overlay网络技术之vxvlan

    了解云计算数据中心网络架构的过程中,看到这么一篇不错的关于大二层技术overlay的文章,转载分享给大家! 一. 传统网络面临的问题 随着企业业务的快速扩展需求,IT做为基础设施,快速部署和减少投入成 ...

  8. gulp快速入门&初体验

    前言 一句话先 gulp 是一个可以简单和自动化"管理"前端文件的构建工具 先说我以前的主要工作,我主要是做游戏服务端的,用c++/python,所以我对东西的概念理解难免要套到自 ...

  9. [ZooKeeper.net] 1 模仿dubbo实现一个简要的http服务的注册 基于webapi

    今天来试着模仿下dubbo实现一个简要的http服务的注册,虽说是模仿不过是很廉价的那种,只是模仿了一点点点...... 先放上demo目录结构: 开头还是把ZooKeeper的一些简要介绍搬过来看看 ...

  10. [HDU1210] Eddy's 洗牌问题

    Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于纸牌也有一定的研究,他在无聊时研究发现,如果他有2N张牌,编号为1,2,3..n,n+1,..2n.这也是 ...