題目大意:
平面給n<=1000個座標,每個座標值範圍在[-1e9,1e9]之間
問,隨便取一些點集,使得點集內的點,在一條直線上,有多少種方案。
方法:按照x,y座標排序。x相同,y從小到大。
這樣,我們從最左邊的點開始,讓這個點固定下來,求這個點必須取的情況下,在這個點的右邊【和上方】的直線中有多少方案。
現在問題主要是,如何找一些經過原點的直線。(求k點的時候,把k點放在原點上)
因為k點一定是最左邊的,所以右邊的點的x座標都是大於等於0的,所有剩下的點可以極角排序,角度相同的,顯然在一條線上了……
注意,有多個點在同乙個點上的情況,要特殊處理一下。。。
#include #include #include #include #include #include #include #include #include #include using namespace std;
typedef long long ll;
const int maxn = 10e5 *4 + 10;
const int mod = 1e9+7;
int n;
struct node
a[1000 + 100], b[1000 + 100];
bool cmp1(node a, node b)
void init()
sort(a + 1, a + 1 + n, cmp1);
}bool cmp2(node a, node b) //極角排序
bool xie_que(node a, node b) //兩點斜率是否相同
ll powmod( ll a , ll b , ll p = mod )//a^b % p
return r ;
}void doit()
ll same=0;
t=0;
for (j = i + 1; j <= n; ++ j)
if (!b[j].x && !b[j].y)
else break;
ans += powmod(2ll, same) -1;
ans %= mod;
if (j<=n)
ans += powmod(2, same) * (powmod(2, t) - 1);
ans %= mod;
++j;
}} }
printf("%lld\n", ans);
}int main()
return 0;
}
HDU 5738 Eureka 共線點集
題目鏈結 題意 給出n個點,每個集合中至少存在兩個點,且他們都共線,問一共有多少個這樣的集合。對於在同乙個位置上的k個點,在這個位置上能產生的集合數為2k k 1 2 k k 1對於其他的點,遍歷每個點,再遍歷其他點,計算出斜率。對於每個相同的斜率,是在這個點位置上至少取乙個點,再在其他點上至少取乙...
E 免費餡餅 HDU 1176
e 免費餡餅 hdu 1176 都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不掉,就掉落在他身旁的10公尺範圍內。餡餅如果掉在了地上當然就不能吃了,所以gameboy馬上卸下身上的揹包去接。但由於小徑兩側...
E 超級密碼 HDU 1226
ignatius花了乙個星期的時間終於找到了傳說中的寶藏,寶藏被放在乙個房間裡,房間的門用密碼鎖起來了,在門旁邊的牆上有一些關於密碼的提示資訊 密碼是乙個c進製的數,並且只能由給定的m個數字構成,同時密碼是乙個給定十進位制整數n 0 n 5000 的正整數倍 如果存在多個滿足條件的數,那麼最小的那個...