這題的複雜度是o(
106log(106
))的fft(害怕.jpg)
預處理cnt[i][j][k]表示x,y,z的差為i,j,k的有多少對,
首先,xi−
xj可以變成xi
+(mx
−xj)
,(mx為最大xi
) 那麼每位都是非負數了,
現在要做3維的多項式乘法,
考慮用2mx進製儲存這三個數,壓在一起變乙個數,這樣就把3維變成1維了,直接用fft
剩下的就是卡常了,看我的**吧,
複雜度:o(
(77∗2
)3∗log((
77∗2)
3))
#include
#include
#include
#define fo(i,a,b) for(register int i=a;i<=b;++i)
#define min(q,w) ((q)>(w)?(w):(q))
#define max(q,w) ((q)
#define pre(q) ((q)*(q))
#define js(q,w,e) ((q)*pre(mx+1)*4+(w)*(mx+1)*2+(e))
using namespace std;
typedef double db;
typedef long long ll;
const int m=(1
<<22)+5;
const db pi=acos(-1);
intread(int &n)
int m1,n,mx;
db ans;
struct z
friend z operator +(z q,z w)
friend z operator -(z q,z w)
friend z operator *(z q,z w)
}c1[m],c[m],ansf[m];
int b1[m],b2[m];
db ans[m];
void dft(z *a,int n,int k)
for(int i=2;i<=n;i<<=1)}}
if(k<0)fo(i,0,n-1)c[i].x=c[i].x/n;
}void fft()
dft(c1,m,-1);
}int main()
fft();
fo(i,0,2
*mx)}}
fo(i,1,m1)}}
printf("%.10lf\n",ans/(n-1.0)/n);
}return
0;}
JZOJ4330 清華集訓模擬 幾何題
也懶得解釋題目大意了 正解居然是fft fftff t?不要看題目的那個式子這麼長,也不要在那個式子上下手。其實我們會發現,不同的 xi xj,yi y j,zi zj x i x j,y i y j,z i z j xi x j y i y j z i z j 並不多。如果我們求出每個三元組的出現...
JZOJ4331 清華集訓模擬 樹
給你一棵帶點權的樹,求將樹變成一堆不相交的鏈,而且這些鏈的權值和非負的方案數。顯然這道題是個dpdp dp。首先求個字首和sum sumsu m。為了後面講述方便,我這樣設 fi,jf fi,j 表示以i ii為根的子樹,其中某條鏈從x xx伸出到i ii的方案數,而且sum x jsum x j ...
JZOJ4331 清華集訓模擬 樹
給你一棵帶點權的樹,求將樹變成一堆不相交的鏈,而且這些鏈的權值和非負的方案數。顯然這道題是個 dp 首先求個字首和 sum 為了後面講述方便,我這樣設 f 表示以 i 為根的子樹,其中某條鏈從 x 伸出到 i 的方案數,而且 sum x j 還有設 g i 表示以 i 為根的,沒有伸出去的鏈的方案數...