快速傅利葉變換應用 計數問題 idiots

2021-09-25 16:44:36 字數 2013 閱讀 2034

【題目描述】

給定n個長度分別為ai的木棒,問隨機選擇3個木棒能夠拼成三角形的概率。

【輸入】

第一行t(t<=100),表示資料組數。

接下來若干行描述t組資料,每組資料第一行是n,接下來一行有n個數表示ai。

3 ≤n

≤105,1

≤ai≤

1053≤n≤105,1≤a_≤105

3≤n≤10

5,1≤

ai​≤

105

【輸出】

t行,每行乙個整數,四捨五入保留7位小數。

【樣例輸入】24

1 3 3 4

42 3 3 4

【樣例輸出】

0.5000000

1.0000000

顯然,總方案數很容易求出來,所以這道題的本質是求合法方案數。這就是乙個經典的計數問題了。第乙個思路是對a陣列排序,但是發現合法方案數依然不方便統計。注意到aia_

ai​和n是同階的,所以我們考慮用max

(ai)

max(a_)

max(ai

​)的桶(b陣列)儲存長度為某乙個值的木棒的數量。那麼接下來我們就需要求出兩兩搭配的方案數,然後列舉第三根木棒統計方案數。而對於兩根木棒組合,我們只關心它們的和的大小。所以我們定義num陣列為:

n um

[i]=

∑b[j

]∗b[

i−j]

num[i]=\sum b[j]*b[i-j]

num[i]

=∑b[

j]∗b

[i−j

]這就是大多數快速傅利葉變換能優化的技術問題的關鍵步驟——乘法原理。顯然這個式子可以用快速傅利葉變換優化。考慮接下來的步驟,num陣列中顯然有一些情況需要排除:

1.同一根木棒會被重複選擇。

2.這樣求出的num中的木棒搭配是有序數對,因此還要除以2。

接下來我們就可以列舉每一根木棒統計答案了。定義sum為num的字首和。為避免重複統計,我們只統計一根木棒長度為三角形中最大時的貢獻。對於一根木棒i

ii,顯然sum

[all

]−su

m[le

n]

sum[all]-sum[len]

sum[al

l]−s

um[l

en]包含了其所有的合法情況。但是其中依然有一些不合法的情況要排除:

1.一根木棒大於當前木棒

2.兩根木棒大於當前木棒

3.其中一根木棒是當前木棒

然後就愉快地做完了。

**:

#include

#define re register

using

namespace std;

const

int n=

2.7e5+5

;inline

intred()

struct cp

friend cp operator

+(cp a,cp b)

friend cp operator

-(cp a,cp b)

friend cp operator

*(cp a,cp b)

}b[n]

;int n,m,a[n]

,c,t,mx=0;

int lim=

1,l=0;

int rev[n]

;long

long num[n]

;long

long sum[n]

;double pi=

3.141592653589793

;void

pre(

)void

fft(cp *f,

int op)}}

if(op==-1

)for

(int re i=

0;i)f[i]

.x/=lim;

}int

main()

}

關於 NSString 的引用計數問題

nsstring str1 aaa nslog lu p unsignedlong str1 retaincount str1 nsstring str2 nsstringalloc initwithstring aaa nslog lu p unsignedlong str2 retaincoun...

MATLAB中快速傅利葉變換fft的應用

傅利葉變換是一種線性的積分變換,它提供了一種可以將訊號從時間幅值座標變換到頻率幅值座標的方法,其具體的定義如下 上式即為傅利葉變換的表示式。傅利葉變換將訊號分解為若干個簡諧訊號疊加的形式,通過傅利葉變換畫出頻譜圖之後就可以找到訊號中包含的頻率成分。matlab中自帶的fft 函式可以幫助我們完成傅利...

iOS 下ARC關於記憶體管理的引用計數問題

arc有效時所有型別都必須加上所有權修飾符。所有權修飾符一共有四種 strong 修飾符 strong修飾符是預設修飾符,表示物件的 強引用 強引用物件在超出其作用域時將會被廢棄,引用的物件釋放。id strong obj1 nsobject alloc init id strong obj2 ob...