題目要求,給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表示輸入結束...