題目鏈結
題意:給出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 的正整數倍 如果存在多個滿足條件的數,那麼最小的那個...