题目:The war of virtual world

题意:在平面内给n个点的坐标,n小于等于200,在这n个点中先选两个点a,b,有(n-1)*n/2种,对于每一种情况,分别求出Ki,Ki等于选定的a,b直线

与剩下的点的交点数,求表达式:

的值。

#include <string.h>
#include <algorithm>
#include <math.h>
#include <stdio.h>
using namespace std;
typedef long long LL;
const int N=210;
const int M=41000;
const int MOD=1000000007;
const double eps=1e-8;
const double PI=acos(-1.0);
const double PI2=PI*2;
struct Point
{
double x,y;
LL index;
double angle;
inline void input()
{
scanf("%lf%lf",&x,&y);
}
}point[N],temp[N];
int n;
bool visit[M];
LL fib[M];
LL fk[M];
int num[N][N];
int left[N][N];
int right[N][N];
inline Point operator-(const Point &a, const Point &b)
{
Point c;
c.x=a.x-b.x;
c.y=a.y-b.y;
return c;
}
inline double operator*(const Point &a, const Point &b)
{
return a.x*b.y-a.y*b.x;
}
inline bool operator==(const Point &a, const Point &b)
{
return a.x==b.x&&a.y==b.y;
}
inline int cross(const Point &a, const Point &b, const Point &o)
{
return (a-o)*(b-o)>0? 1:-1;
}
inline int cross(const int &a, const int &b, const int &o)
{
return cross(point[a],point[b],point[o]);
}
inline double positiveAtan(const Point &a, const Point &o)
{
double res=atan2(a.y-o.y,a.x-o.x);
if(res<0)
res+=PI2;
return res;
}
bool operator<(const Point &a, const Point &b)
{
return a.angle<b.angle;
}
int abs1(int x)
{
return x<0? -x:x;
}
int getAngleNumber(int a,int b,int c)
{
if(point[c].y<point[b].y&&point[a].y>=point[b].y)
return n-abs1(right[b][c]-right[b][a]+2)+3;
return abs1(right[b][a]-right[b][c])+2;
}
int getTriangleNumber(int a, int b, int c)
{
return n-left[a][b]-left[b][c]-left[c][a]+getAngleNumber(a,b,c)+getAngleNumber(b,c,a)+getAngleNumber(c,a,b)-6;
}
LL quick_mod(LL a,LL b)
{
LL ans=1;
a%=MOD;
while(b)
{
if(b&1)
{
ans=ans*a%MOD;
b--;
}
b>>=1;
a=a*a%MOD;
}
return ans;
}
LL solve(int x)
{
if(visit[x])
return fk[x];
visit[x]=true;
fib[0]=x;
fib[1]=x;
for(int i=2;i<=x;++i)
fib[i]=(fib[i-1]*fib[i-2])%MOD;
return fk[x]=fib[x]+1;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<n;++i)
{
point[i].input();
temp[i]=point[i];
temp[i].index=i;
}
memset(left,0,sizeof(left));
memset(right,0,sizeof(right));
for(int i=0;i<n;++i)
{
for(int j=i+1;j<n;++j)
{
for(int k=0;k<n;++k)
{
if(k!=i&&k!=j)
{
if(cross(k,j,i)<0)
++left[i][j];
else if(cross(k,i,j)<0)
++left[j][i];
}
}
}
for(int j=0;j<n;++j)
{
if(temp[j].index==i)
temp[j].angle=-1e100;
else
temp[j].angle=positiveAtan(temp[j],point[i]);
}
sort(temp,temp+n);
int cnt=0;
for(int j=0;j<n;++j)
right[i][temp[j].index]=++cnt;
}
memset(num,0,sizeof(num));
for(int i=0;i<n;++i)
{
for(int j=i+1;j<n;++j)
{
for(int k=0;k<n;++k)
{
if(k==i||k==j) continue;
if(cross(point[k], point[j], point[i]) < 0)
num[i][j]+=getAngleNumber(j,k,i)-getTriangleNumber(i,j,k);
}
}
}
LL ans=1;
for(int i=0;i<n;++i)
for(int j=i+1;j<n;++j)
ans=(ans*solve(num[i][j]))%MOD;
printf("%I64d\n", ans);
}
return 0;
}

HDU4367(线段相交与斐波那契数列)相关推荐

  1. 2018.10.09 ZYH的斐波那契数列(线段树+矩阵快速幂)

    描述 ZYH最近研究数列研究得入迷啦! 现在有一个斐波拉契数列(f[1]=f[2]=1,对于n>2有f[n]=f[n-1]+f[n-2]), 但是斐波拉契数列太简单啦,于是ZYH把它改成了斐波拉 ...

  2. ZYH的斐波那契数列【线段树动态开点+矩阵快速幂求斐波那契】

    描述 ZYH最近研究数列研究得入迷啦! 现在有一个斐波拉契数列(f[1]=f[2]=1,对于n>2有f[n]=f[n-1]+f[n-2]), 但是斐波拉契数列太简单啦,于是ZYH把它改成了斐波拉 ...

  3. 斐波那契数列的各种求法

    斐波那契数列百科名片 "斐波那契数列"是意大利数学家列昂纳多·斐波那契首先研究的一种递归数列, 它的每一项都等于前两项之和. 此数列的前几项为1,1,2,3,5等等. 在生物数学中 ...

  4. 漫谈斐波那契数列与黄金分割比

    (一)奇妙的斐波那契数列: 斐波那契数列的由来是"兔子问题". 从中总结的规律就是: (1)每个月小兔子数 = 上个月的大兔子数: (2)每个月的大兔子数 = 上个月的大兔子数 + ...

  5. 斐波那契数列与黄金分割比

    原文地址:https://blog.csdn.net/g1933375079/article/details/18773641(如有侵权请联系删除) (一)奇妙的斐波那契数列: 斐波那契数列的由来是& ...

  6. 以斐波那契数列实现黄金分割数的验证

    几日前,在看明朝那些事儿的时候突然看到书中有提到黄金分割数,于是兴起百度了一下黄金分割数的具体概念,发现了黄金分割数与斐波那契数列之间不可言喻的联系. 黄金分割数相信大家都听说过但是很少去刻意了解.我 ...

  7. 斐波那契数列的迭代算法和递归算法

    斐波那契数列 斐波那契数列(Fibonacci sequence),又称"黄金分割数列",因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入, ...

  8. 动态规划法(一)从斐波那契数列谈起

    动态规划法与分治方法   动态规划(Dynamic Programming)与分治方法相似,都是通过组合子问题的解来求解原问题.不同的是,分治方法通常将问题划分为互不相交的子问题,递归地求解子问题,再 ...

  9. java 斐波拉_Java实现斐波那契数列

    斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&g ...

最新文章

  1. C# Levenshtein计算字符串的相似度
  2. SCP传输文件和断点续传
  3. SAP CRM WebClient UI cross component跳转中有一个硬编码的CROSSNAV
  4. 理解 Glance - 每天5分钟玩转 OpenStack(20)
  5. matlab怎么安装compiler,关于MATLAB中compiler配置问题
  6. java联接pg库_成为Java流大师–第5部分:将联接的数据库表转换为流
  7. php数组的声明和类型
  8. 信息学奥赛一本通C++语言——1050:骑车与走路
  9. Eclipse最新插件的下载地址大全[收集整理] zt
  10. [转贴]基于HTTP的QQ协议
  11. form表单input file类型的重置
  12. 【转】如何查看linux版本 如何查看LINUX是多少位
  13. php post提交函数,PHP curl get post 提交函数
  14. 常用shell命令归纳总结
  15. 【AD10】Altium Designer 10导入元件库图文教程
  16. 卡巴斯基2006以上版本与金山词霸 的冲突
  17. odoo-OPENERP仓库各类知识详解
  18. 2018年中山大学计算机考研初试经验贴
  19. 计算机视觉及色彩空间RGB,HSV,HLS,Lab,LMS,XYZ,CMYK
  20. WORD出现VBE6EXT.OLD不能被加载的问题

热门文章

  1. DefaultListableBeanFactory 对配置lazy-init 属性单态Bean 的预实例化
  2. Spring5的通信报文
  3. 微服务网关Gateway-PrefixPath讲解
  4. 定义和使用含有泛型的类
  5. Response_案例3_输出字节数据
  6. activemq使用
  7. mysql count 排序_SQL进阶排序和窗口函数
  8. java 直播服务器_MyLive--使用JAVA实现的直播RTMP服务器
  9. koa2 mysql增删改查_react+koa2+mysql零门槛的全栈体验,附上完整项目分享
  10. enum 使用规范及技巧(C# 参考)