)的dp很容易能想到
定義d p[
i][j
][k]
dp[i][j][k]
dp[i][
j][k
]表示第i個人選j時,有k個人比它小的概率
然後就能直接算期望了。
不過這玩意顯然要t
發現,對於乙個已經固定的i,j,那麼剩下的所有人的所有情況本質上只有2種:比ai,
ja_ai,j
小,比ai,
ja_ai,j大。
那麼可以把每個人比它小的概率算出來,比它大的概率算出來,那麼就可以看作乙個多項式p0+
p1xp_0+p_1x
p0+p1
x顯然,其他所有人的多項式之積就是它的dp值。
(此時就有同學會去想分治fft了,還好這題模數不是ntt模數,不然估計我也得掉坑里去寫ntt…)
考慮是否能有更好的方式維護這個多項式。
顯然,我們可以按照ai,
ja_ai,j
排序,這樣每做乙個,就只有乙個多項式會改變。那麼我們就能通過多項式除法去消除該多項式的影響。
由於該多項式一定只有2項,所以可以(o(
n))(o(n))
(o(n))
暴力除總複雜度o(n
3)o(n^3)
o(n3
)
#include
#include
#include
#include
#define sf scanf
#define pf printf
#define maxn 210
#define mod 1000000007
using
namespace std;
typedef
long
long ll;
struct node
}ch[maxn*maxn]
;int tot;
int m[maxn]
;ll inv100;
pair now[maxn]
;ll f[maxn]
,v[maxn]
,ans[maxn]
;ll fsp
(ll x,
int y)
return res;
}int n;
void
dev(
int x)
void
mul(
int x)
intmain()
int inq=
fsp(q,mod-2)
;for
(int j=
1;j<=m[i]
;j++
)(ch[tot-m[i]
+j].p*
=inq)
%=mod;
}for
(int i=
1;i<=n;i++)sf
("%lld"
,&v[i]);
reverse
(v+1
,v+1
+n);
sort
(ch+
1,ch+
1+tot)
; f[0]
=1;for
(int i=
1;i<=n;i++
) now[i]
=make_pair(1
,0);
for(
int id=
1;id<=tot;id++
)\n",i,j);
// for(int i=0;i// pf("%lld ",f[i]);
// pf("\n");
for(
int k=
0;k) ans[i]
=(ans[i]
+p*f[k]
%mod*v[k+1]
%mod*ch[id]
.g%mod*inv100%mod)
%mod;
// pf("\n",ans[i]);
now[i]
.first=
(now[i]
.first-ch[id]
.p+mod)
%mod;
now[i]
.second=
(now[i]
.second+ch[id]
.p)%mod;
// pf("\n",now[i].first,now[i].second);
mul(i)
;// for(int i=0;i// pf("%lld ",f[i]);
// pf("\n");
}for
(int i=
1;i<=n;i++)pf
("%lld\n"
,ans[i]);
}
省選模擬51
利用本題的特殊性質,可以得到如果 n 為奇數,那麼答案為 ab 對這個玩意平方一下即可發現是對的。對於 n 為偶數,可以把 2 全都提取出來,然後對剩餘的部分取得乙個解。然後不斷縮小 2 的次數以迭代,當縮小為 2 0 的時候可以直接得到解。很妙的一步是當 y 0 1 因為 y 0 1 有 y 0 ...
再次模擬 多項式輸出
題目描述 一元 n 次多項式可用如下的表示式表示 f x an x n an 1 x n 1 a1 x a0,an 0 其中,ai a x 稱為i次項,ai稱為i次項的係數。給出乙個一元多項式各項的次數和係數,請按照如下規定的格式要求輸出該多項式 多項式中自變數為x,從左到右按照次數遞減順序給出多項...
P1067 多項式輸出(模擬)
題目鏈結 p1067 多項式輸出 luogu 應用題庫 訓練比賽 記錄討論 21.2k 通過74.5k 提交題目提供者 ccf noi 評測方式 雲端評測 標籤 noip普及組2009 難度 普及 時空限制 1000ms 128mb 其中,a ix ia i x i稱為ii次項,a ia i 稱為i...