HDU4609 FFT 組合計數

2021-09-25 13:29:14 字數 2503 閱讀 8349

傳送門:

找出n根木棍中取出三根木棍可以組成三角形的概率

我們統計每種長度的棍子的個數

我們對於長度就有乙個多項式

\[ f=num[0]*i_0+num[1]*i_1+num[2]*i_2.....num[len]*i_len \]

我們考慮兩根棍子可以組成所有長度的方案數

所以我們對num陣列求一次fft

兩根棍子組成長度的上界是\(len_*2\)

可能存在棍子重複組合的情況,這個時候我們需要去重

去掉兩種重複的情況

1.自己和自己組合 即去除a[i]+a[i]的情況

2.a和b組合 b又和a組合的情況 這種時候每個組合/2即可

然後通過組合數計數即可,tips:在過程中可能爆int

#include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

typedef pairpii;

typedef unsigned long long ull;

#define ls rt<<1

#define rs rt<<1|1

#define lson l,mid,rt<<1

#define rson mid+1,r,rt<<1|1

#define bug printf("*********\n")

#define fin freopen("input.txt","r",stdin);

#define fon freopen("output.txt","w+",stdout);

#define io ios::sync_with_stdio(false),cin.tie(0)

#define debug1(x) cout<<"["<<#x<<" "<<(x)<<"]\n"

#define debug2(x,y) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<"]\n"

#define debug3(x,y,z) cout<<"["<<#x<<" "<<(x)<<" "<<#y<<" "<<(y)<<" "<<#z<<" "<>= 1;

} return ans;

}struct complex

} x[maxn];

int a[maxn];

complex operator + (complex a, complex b)

complex operator - (complex a, complex b)

complex operator * (complex a, complex b)

int n, m;

int l, r[maxn];

int limit = 1;

void fft(complex *a, int type)

for(int mid = 1; mid < limit; mid <<= 1) }}

}ll num[maxn];//100000*100000會超int

ll sum[maxn];

int main()

sort(a, a + n);

int len1 = a[n - 1] + 1;

limit = 1;

l = 0;

while(limit < 2 * len1) limit <<= 1, l++;

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

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

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

fft(x, 1);

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

fft(x, -1);

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

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

limit = 2 * a[n - 1];

//去重,去除 a_i,a_i這種情況

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

//去重,去除 (a_i,a_j),(a_j,a_i)這種情況

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

sum[0] = 0;

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

sum[i] = sum[i - 1] + num[i];

ll cnt = 0;

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

//總數

long long tot = (long long)n * (n - 1) * (n - 2) / 6;

printf("%.7f\n", (double)cnt / tot);

}return 0;

}

HDU4609 FFT 組合計數

傳送門 找出n根木棍中取出三根木棍可以組成三角形的概率 我們統計每種長度的棍子的個數 我們對於長度就有乙個多項式 f num 0 i 0 num 1 i 1 num 2 i 2.num len i len 我們考慮兩根棍子可以組成所有長度的方案數 所以我們對num陣列求一次fft 兩根棍子組成長度的...

組合計數(初步)

組合數學主要是研究某組離散物件滿足一定條件的安排的存在性 構造及計數等問題。組合計數理論是組合數學中乙個最基本的研究方向,主要研究滿足一定條件的安排方式的數目及其計數問題。本課程主要介紹組合數學中常見的和重要的一些計數原理 計數方法和計數公式,包括一般的排列 組合的計算以及生成函式 容斥原理 反演原...

組合計數小啟發

在dp的領域中還有的很大一部分就是組合計數。以前做了fhq在集訓隊作業中的 連邊 這道題,大概就是要你給乙個圖連邊是的若干個點度數為奇數。比較容易發現是一道dp題,但是怎樣保證狀態不重不漏?常用的方法就是增維,比如按照排序大小擴充套件啦,按照字典序擴充套件啦從而使得狀態不重,但是還有兩種方法可以使得...