题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5738

题意:从n(n <= 1000)个点(有重点)中选出m(m > 1)个点(选出的点只看标号,不看具体坐标)合成一个集合,问集合中的点共线(可以重合)的集合个数?

思路:按照x,y双关键字排序,之后对每一个点求出所有以它为一个端点的线段个数;

及时计数:要求以当前点为端点的线段数,分成两种情况:

1. 线段就为当前点,即将当前点的重点合成一个点,C(n,2)+C(n,3)+...+C(n,n) = 2n-n-1;

2. 除了包含若干个当前点还有其他点,构成线段;这时对于当前点可取值为2n-1;这时因为其它点是否有重点,对于当前点并没有什么区别;

直接同一斜率的点的个数相加即可(点的个数是指重点缩为一点)细节:不要使用unique来编码。。直接O(n)在线编码好得多;否则还需重载 ==运算符,而目的只是求解出当前节点的重点个数;

对于斜率最好使用最简分数的形式保存在map中;

 #pragma comment(linker, "/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
#define MSi(a) memset(a,0x3f,sizeof(a))
#define inf 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m+1, r, rt << 1|1
#define A first
#define B second
#define MK make_pair
#define esp 1e-8
#define mod 1000000007
#define zero(x) (((x)>0?(x):-(x))<eps)
#define bitnum(a) __builtin_popcount(a)
#define clear0 (0xFFFFFFFE) typedef pair<int,int> PII;
typedef long long ll;
typedef unsigned long long ull;
template<typename T>
void read1(T &m)
{
T x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
m = x*f;
}
template<typename T>
void read2(T &a,T &b){read1(a);read1(b);}
template<typename T>
void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
template<typename T>
void out(T a)
{
if(a>) out(a/);
putchar(a%+'');
}
inline ll gcd(ll a,ll b){ return b == ? a: gcd(b,a%b); }
struct point2{
ll x, y;
}p[];
bool cmp(point2 a,point2 b)
{
return a.x == b.x ? a.y < b.y: a.x < b.x;
}
map<PII,int> mp;
ll _2[];
int main()
{
//freopen("data.txt","r",stdin);
//freopen("out.txt","w",stdout);
_2[] = ;
rep1(i,,) _2[i] = (_2[i-]<<)%mod;
int T, n;
cin >> T;
while(T--){
ll ans = ;
read1(n);
rep0(i,,n) read2(p[i].x, p[i].y);
sort(p,p+n,cmp);
rep0(i,,n){
int cnt = ;
while(p[i+].x == p[i].x && p[i+].y == p[i].y) cnt++,i++;
mp.clear();
rep0(j,i+,n){
ll dy = p[i].y - p[j].y,
dx = p[i].x - p[j].x;
ll g = gcd(dy,dx);
mp[MK(dy/g, dx/g)]++;
}
ans = (ans + _2[cnt]-cnt-)% mod;
for(auto v = mp.begin(); v != mp.end(); v++){
ans = (ans + (_2[cnt]-)*(_2[v->second]-))% mod;
}
}
printf("%lld\n", ans);
}
return ;
}

hdu 5738 2016 Multi-University Training Contest 2 Eureka 计数问题(组合数学+STL)的更多相关文章

  1. 2016 Al-Baath University Training Camp Contest-1

    2016 Al-Baath University Training Camp Contest-1 A题:http://codeforces.com/gym/101028/problem/A 题意:比赛 ...

  2. hdu 4915 Parenthese sequence--2014 Multi-University Training Contest 5

    主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4915 Parenthese sequence Time Limit: 2000/1000 MS (Ja ...

  3. hdu 4902 Nice boat--2014 Multi-University Training Contest 4

    题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=4902 Nice boat Time Limit: 30000/15000 MS (Java/Othe ...

  4. hdu 4925 Apple Tree--2014 Multi-University Training Contest 6

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4925 Apple Tree Time Limit: 2000/1000 MS (Java/Others ...

  5. HDU校赛 | 2019 Multi-University Training Contest 6

    2019 Multi-University Training Contest 6 http://acm.hdu.edu.cn/contests/contest_show.php?cid=853 100 ...

  6. HDU校赛 | 2019 Multi-University Training Contest 5

    2019 Multi-University Training Contest 5 http://acm.hdu.edu.cn/contests/contest_show.php?cid=852 100 ...

  7. HDU校赛 | 2019 Multi-University Training Contest 4

    2019 Multi-University Training Contest 4 http://acm.hdu.edu.cn/contests/contest_show.php?cid=851 100 ...

  8. HDU校赛 | 2019 Multi-University Training Contest 3

    2019 Multi-University Training Contest 3 http://acm.hdu.edu.cn/contests/contest_show.php?cid=850 100 ...

  9. HDU校赛 | 2019 Multi-University Training Contest 2

    2019 Multi-University Training Contest 2 http://acm.hdu.edu.cn/contests/contest_show.php?cid=849 100 ...

随机推荐

  1. Oracle 经典语法(三)

    1. 让SELECT TO_CHAR(sal,'L99,999.99') FROM emp WHERE  ROWNUM < 5 输出结果的货币单位是¥和$.SELECT TO_CHAR(sal, ...

  2. 把Flume的Source设置为 Spooling directory source

    把Flume的Source设置为 Spooling directory source,在设定的目录下放置需要读取的文件,一些文件在读取过程中会报错. 文件格式和报错如下: 实验一 读取汉子和“:&qu ...

  3. angularjs表格方式显示数据

    <table> <tr ng-repeat="x in names"> <td>{{ x.Name }}</td> <td&g ...

  4. hdu 4039 暴力

    思路:用map将每个字符串与一个数字进行对应,然后暴力统计就好了 #include<cstring> #include<iostream> #include<cstdio ...

  5. 转:eclipse怎样修改包(package)的显示样式、格式 工具/原料

    转:http://blog.csdn.net/longyaxx258/article/details/50774128 eclipse 打开我们的项目,可以看到左侧的package看上去特别多,没有层 ...

  6. html+CSS--水平居中设置(定宽块状元素)

    来源:http://www.imooc.com/code/4336 当被设置元素为 块状元素 时用 text-align:center 就不起作用了,这时也分两种情况:定宽块状元素和不定宽块状元素. ...

  7. sysobjects.xtype介绍

    SQL Server数据库的一切信息都保存在它的系统表格里. 在大多数情况下,对你最有用的两个列是Sysobjects.name和Sysobjects.xtype.前面一个用来列出待考察对象的名字,而 ...

  8. Javascript验证用户输入URL地址是否正确

    <script type="text/javascript">function checkUrl() { var url = document.getElementBy ...

  9. 清除windows的EFS加密

        所使用软件为aefsdr_setup_en,搜索名为advanced.efs.data.recovery   1.         创建需要加密的文件   2.         进行加密   ...

  10. QtPropertyBrowser+vs2010的安装与配置(转)

    这一篇文章有些问题,后又写了一篇,地址是http://www.cnblogs.com/aminxu/p/4552410.html 转自http://blog.csdn.net/jingwenlai_s ...