選木棍構成三角形(FFT

2021-09-10 04:00:31 字數 1799 閱讀 1608

題目要求,給n個木棍,從中選3個,問能構成三角形的概率多大。

n<= 1e5.

木棍長度<=1e5.

注意事項:

直接把len開成1e5會tle。

統計答案的時候可能會爆int。

刪除非法情況。

#include #define ll long long

using namespace std;

const double pi = acos(-1.0);

struct complex

complex operator -(const complex &b) const

complex operator +(const complex &b) const

complex operator *(const complex &b) const

};void change(complex y, int len)

if(j < k) j += k;

}}void fft(complex y, int len, int on) }}

if(on == -1)

for(int i = 0; i < len; i++)

y[i].x /= len;

}const int n = 1e5+100;

complex x1[8*n],x2[8*n];

ll a[n],num[n],b[n];

vectorq;

ll sum[8*n];

int main()

int len1 = maxx+1;

int len = 1;

int len2 = maxx+1;

for(int i = 0; i < len1; i++)

while(len < len1*2 || len < len2*2) len <<= 1;

for(int i = 0; i < len1; i++) x1[i] = complex(a[i],0);

for(int i = len1; i < len; i++) x1[i] = complex(0,0);

for(int i = 0; i < len2; i++) x2[i] = complex(b[i],0);

for(int i = len2; i < len; i++) x2[i] = complex(0,0);

fft(x1,len,1);

fft(x2,len,1);

for(int i = 0; i < len; i++) x1[i] = x1[i]*x2[i];

fft(x1,len,-1);

len = len1+len2-1; //這才是有用的len

for(int i = 0; i < len; i++)

for(auto x:q)

for(int i = 0; i < len; i++) sum[i]/=2; //(i,j)和(j,i)重複

for(int i = 1; i < len; i++) sum[i] += sum[i-1]; //sum[i]表示取兩個木棍,長度之和<=i的取法

sort(q.begin(),q.end());

ll ans = 0;

for(int i = 0; i < n; i++)

double p = ans*6.0/(1.0*n*(n-1)*(n-2)); //除以總選法

printf("%.7f\n",p);

}return 0;

}

求大三角形中三角形個數

一道筆試程式設計題要求求乙個大三角形中所有小三角形的個數,大約是下面這種情況 首先想到是的將問題由求邊長為n的三角形個數 求邊長為n 1的三角形個數 求邊長為1的三角形個數 1,回溯求得所有三角形個數。但是再仔細一看因為有重疊三角形和倒置的三角形,所以這個方法不可行。接著找到三角形個數由三部分組成 ...

經典演算法 (三)帕斯卡三角形(楊輝三角形)

楊輝三角,是二項式係數在三角形中的一種幾何排列。在歐洲,這個表叫做帕斯卡三角形。帕斯卡 1623 1662 是在1654年發現這一規律的,比楊輝要遲393年,比賈憲遲600年。簡介 楊輝三角,是二項式係數在三角形中的一種幾何排列。在歐洲,這個表叫做帕斯卡三角形。帕斯卡 1623 1662 是在165...

三角形面積

算是自己第一道正式寫的演算法幾何吧,先從簡單的開始吧,加油!描述 給你三個點,表示乙個三角形的三個頂點,現你的任務是求出該三角形的面積 輸入 每行是一組測試資料,有6個整數x1,y1,x2,y2,x3,y3分別表示三個點的橫縱座標。座標值都在0到10000之間 輸入0 0 0 0 0 0表示輸入結束...