博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Project Eular 630
阅读量:4876 次
发布时间:2019-06-11

本文共 2249 字,大约阅读时间需要 7 分钟。

大概这一题题意:

给你n=2500个点,生成方式给你了

设Ln表示这n个点两两连出来的直线(去重后,例如(1 1) (2 2) (3 3)只有一条直线)

问这些直线之间两两一共有多少个交点

(两条线交在一起算2次,因为A交B一次,B交A一次)

三条线交在一个点算6次,因为AB,AC,BA,BC,CA,CB)

 

 

做法:

我们只要考虑平行的,没有交,不平行的都有交,这样就把复杂度弄到n^2级别了

用分数类统计以后直接计算即可

代码(分数类板子比较重要...):

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;int new_s(){ static int s=290797; s=(long long)s*s%50515093; return s;}struct point{ int x; int y; void get() { x=new_s()%2000-1000; y=new_s()%2000-1000; }};int get_sgn(int x){ if (x==0) return 0; if (x>0) return 1; return -1;}struct fenshu{ int fenzi; int fenmu; int sgn() const { return get_sgn(fenzi)*get_sgn(fenmu); } fenshu (int x=0,int y=1) { fenzi=x; fenmu=y; } friend fenshu operator / (const fenshu &a,const fenshu &b) { return fenshu(a.fenzi*b.fenmu,b.fenzi*a.fenmu); } friend fenshu operator * (int k,const fenshu &b) { return fenshu(k*b.fenzi,b.fenmu); } friend fenshu operator * (const fenshu &b,int k) { return fenshu(k*b.fenzi,b.fenmu); } friend fenshu operator - (int y,const fenshu &a) { return fenshu(y*a.fenmu-a.fenzi,a.fenmu); } friend bool operator == (const fenshu &a,const fenshu &b) { if ((a.fenmu==0)^(b.fenmu==0)) return false; return (long long)a.fenzi*b.fenmu==(long long)a.fenmu*b.fenzi; } friend bool operator < (fenshu a,fenshu b) { if (a.fenmu==0) return false; if (b.fenmu==0) return true; int k1=a.sgn(); int k2=b.sgn(); if (k1!=k2) { return k1
(long long)a.fenmu*b.fenzi; } else { return (long long)a.fenzi*b.fenmu<(long long)a.fenmu*b.fenzi; } }};point a[2505];//#define fenshu long doublestruct line{ fenshu k; fenshu b; line () { } line (point a,point bb) { #ifdef fenshu k=(double)(a.y-bb.y)/(a.x-bb.x); #else k=fenshu(a.y-bb.y,a.x-bb.x); #endif if (a.x==bb.x) { #ifdef fenshu k=1e300; b=a.x; #else k=fenshu(1,0); b=fenshu(a.x,1); #endif } else { b=a.y-k*a.x; } } friend bool operator < (const line &a,const line &b) { if ((a.k
1) printf("%d\n",now); ans-=(long long)now*(now-1); now=1; } } ans-=(long long)now*(now-1); cout<
<

  

转载于:https://www.cnblogs.com/absi2011/p/9256604.html

你可能感兴趣的文章
Mybatis的关联映射案例
查看>>
linux sed命令详解
查看>>
ES Document API之单文档API
查看>>
poj3624
查看>>
Javascript获取URL参数值
查看>>
Bzoj1072--Scoi2007排列perm
查看>>
压缩跟踪(CT)代码具体学习_模块1(样本的採集和扩充)
查看>>
地理常识
查看>>
GB28181出内网
查看>>
学习设计模式 - 六大基本原则之迪米特法则
查看>>
IIS7上设置MIME让其支持android和Iphone的更新下载
查看>>
ios的分辨率统计
查看>>
读入优化与输出优化
查看>>
Android Drawable - Shape Drawable使用详解(附图)
查看>>
巨蟒python全栈开发flask3
查看>>
巨蟒python全栈开发flask13项目开始5
查看>>
p2psearcher绿色版使用方法
查看>>
PHP 序列化与反序列化
查看>>
【转】TCP粘包分析
查看>>
zoj-3872 Beauty of Array (dp)
查看>>