HDU 5738 Eureka 共線點集

2021-08-21 05:28:47 字數 1491 閱讀 3743

題目鏈結

題意:給出n個點,每個集合中至少存在兩個點,且他們都共線,問一共有多少個這樣的集合。

對於在同乙個位置上的k個點,在這個位置上能產生的集合數為2k

−k−1

2 k−

k−

1對於其他的點,遍歷每個點,再遍歷其他點,計算出斜率。對於每個相同的斜率,是在這個點位置上至少取乙個點,再在其他點上至少取乙個點。設這個點上有p個點,其他共有q個點對應於這個點能產生這個斜率,則此時an

s=an

s+(2

p−1)

(2q−

1)a ns

=ans

+(2p

−1)(

2q−1

)千萬不要像我一樣幹這種對點去重對斜率不去重的傻事……

#include 

using

namespace

std;

typedef

long

long ll;

typedef pair point;

const ll mod = 1e9 + 7;

const ll inf = 1e11;

int t;

int n;

point point[1010];

int cntp;

mapbool> vis;

mapint> cnt;

ll ans;

ll mypow[1010]; // 2^n

// map vis2; // 記錄斜率是否存在

map cntxielv;

double xielv[1010];

int cntx;

void init_mypow()

}int main()

else

}// for (int i=1;i<=cntp;i++)

// printf("cntp = %d\n", cntp);

for (int i = 1; i <= cntp; i++)

else

}sort(xielv + 1, xielv + cntx + 1);

// 以上:把i這個點對應其他點的所有斜率求出+排序後放入xielv中,記為xielv[1-cntx]

for (int j = 1; j <= cntx; j++)

// printf("cntp = %d | cntq = %d\n", cntp, cntq);

ans = (ans + (mypow[cntp] - 1) * (mypow[cntq] - 1) % mod + mod) % mod;}}

// ans = ans / 2;

// 加上在同乙個點上的點所構成的集合

for (int i = 1; i <= cntp; i++)

ans = (ans + mod) % mod;

printf("%lld\n", ans);

}}

HDU 5738 Eureka 極角排序,注意讀題

題目大意 平面給n 1000個座標,每個座標值範圍在 1e9,1e9 之間 問,隨便取一些點集,使得點集內的點,在一條直線上,有多少種方案。方法 按照x,y座標排序。x相同,y從小到大。這樣,我們從最左邊的點開始,讓這個點固定下來,求這個點必須取的情況下,在這個點的右邊 和上方 的直線中有多少方案。...

E 免費餡餅 HDU 1176

e 免費餡餅 hdu 1176 都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不掉,就掉落在他身旁的10公尺範圍內。餡餅如果掉在了地上當然就不能吃了,所以gameboy馬上卸下身上的揹包去接。但由於小徑兩側...

E 超級密碼 HDU 1226

ignatius花了乙個星期的時間終於找到了傳說中的寶藏,寶藏被放在乙個房間裡,房間的門用密碼鎖起來了,在門旁邊的牆上有一些關於密碼的提示資訊 密碼是乙個c進製的數,並且只能由給定的m個數字構成,同時密碼是乙個給定十進位制整數n 0 n 5000 的正整數倍 如果存在多個滿足條件的數,那麼最小的那個...