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. 如何用docker安装laravel开发环境

    如何用docker安装laravel开发环境 看laravel框架的官方文档安装部分时,发现需要安装特别多软件,估计还有许多复杂的配置,官方推荐使用Laravel Homestead虚拟机进行安装,但 ...

  2. Struts2系列笔记(7)---Struts2类型转换

    Struts2类型转换      struts2中内置了大量的类型转换器用来完成数据类型转换的问题,这篇随笔主要通过两个方面来写Struts类型转换 1:Struts2内置的类型转换器 2:如何自定义 ...

  3. JavaScript中国象棋程序(7) - 置换表

    "JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第2节. 这一系列共有9个部分: 0.JavaScript中国象 ...

  4. c++针对数据库,文件的操作总结(原始)

    1.将文件保存到sqlserver数据库的相关操作: Update t1 .txt’, SINGLE_BLOB ) Select convert( varchar(), data ) 注:fileTy ...

  5. 球谐光照(Spherical Harmonics Lighting)及其应用-应用篇

    上一篇介绍了球谐函数的一些原理和性质,本篇主要介绍如何实现球谐光照,将这种光照应用到实际的场景中去. 我们知道,球谐光照实际上就是将周围的环境光采样成几个系数,然后渲染的时候用这几个系数来对光照进行还 ...

  6. 架构师之路——里氏替换原则LSP

    定义: 如果对每一个对类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型. 内容: 里氏替换原则通 ...

  7. 【openstack N版】——创建云主机

    一.启动实例 1.1 已准备服务介绍 MySql:为各个服务提供数据存储. RabbitMQ:为各个服务之间通信提供交通枢纽. keystone:为各个服务之间通信提供认证和服务注册. Glance: ...

  8. angular 1.26 版本 window.history.back() 自动去顶部

    在1.26版本,在url ("www.example.com#xx"),接着按back,会自动调到顶部,这是因为angular的默认设置 只要在config注入$AnchorScr ...

  9. 2017-3-2 C#基础 集合

    要使用集合必须先引用命名空间,using System.Collections; 集合与数组的不同: 数组:同一类型,固定长度集合:不同类型,不固定长度 集合主要分为六大类:普通集合,泛型集合,哈希表 ...

  10. 【疑问】css

    1.p{float:left}好像意思是p后面的元素往左浮动的意思啊!!2.ff下,button的文字好像没法垂直居中2.1 button垂直对齐,其line-height似乎需要减2px(依边框宽度 ...