6810 2020 10 05提高組模擬 路哥

2021-10-10 01:14:44 字數 2676 閱讀 5587

【輸入輸出樣例 1 說明】

斷掉第 1, 2 條邊或者只斷第 1 條邊均可恰好獲得 1 朵花朵,這兩種情況的概率的和為 0.5。 

樹形依賴揹包。

選當前這個點必須先選父親節點。

考慮設f[ i ][ j ]表示第i個點與第1個點聯通並且總和為j的概率。

遞迴之前將父親的f轉移到兒子上,以便兄弟節點揹包時用,遞迴完後再統計到父親節點上。

兩種考慮方式,

法一:遞迴前,考慮當前這條父親與兒子的邊必選要選。

f[ son ][ j ]=f[ x ][ j-a[ son ] ] * 1/2

遞迴後,兩種情況,

選當前這條邊,那麼就是f[ son ][ j ](已經乘了概率了),

不選,就是f[ x ][ j ] *1/2

初值f[ 1 ][ a[ 1 ] ]=1

法二:先將1節點的兒子全部砍掉,則有:

初值f[ 1 ][ a[ 1 ] ]=(1/2)^k(k為1節點的兒子數)

遞迴前,父親轉移到兒子時,當前邊要必選(可視為在父親節點割掉所有兒子節點的邊時已經計算過)

然後再割掉兒子的所有兒子節點的邊。

f[ son ][ j ]=f[ x ][ j- a[ son ] ]*(1/2)^k(k為son的兒子數)

遞迴後,直接加上即可。

f[ x ][ j ]= f[ x ][ j ]+f[ son ][ j ]

#include#include#include#include#define i int

#define ll long long

#define f(i,a,b) for(i i=a;i<=b;i++)

#define fd(i,a,b) for(i i=a;i>=b;i--)

#define mem(a,b) memset(a,b,sizeof a)

#define n 5005

#define m 998244353

using namespace std;

i n,m,x,y,f[n][n],a[n],t[n<<1],nx[n<<1],ls[n],tot,e=499122177;

void r(i &x)

while(c>='0'&&c<='9')

x*=w;

}void add(i x,i y)

void dg(i x,i y)

dg(t[k],x);

f(j,1,m) f[x][j]=((ll)f[x][j]*e+f[t[k]][j])%m; }}

i main()

f[1][a[1]]=1;

dg(1,0);

printf("%d\n",f[1][m]);

return 0;

}

#include#include#include#include#define i int

#define ll long long

#define f(i,a,b) for(i i=a;i<=b;i++)

#define fd(i,a,b) for(i i=a;i>=b;i--)

#define mem(a,b) memset(a,b,sizeof a)

#define n 5005

#define m 998244353

using namespace std;

i n,m,x,y,d[n],g[n],f[n][n],a[n],t[n<<1],nx[n<<1],ls[n],tot;

void r(i &x)

while(c>='0'&&c<='9')

x*=w;

}void add(i x,i y)

void dg(i x,i y)

dg(t[k],x);

f(j,1,m) f[x][j]=((ll)f[x][j]+f[t[k]][j])%m; }}

i main()

g[g[0]=1]=499122177;

f(i,2,n) g[i]=(ll)g[i-1]*g[1]%m;

f(i,1,n)

f[1][a[1]]=g[d[1]];

dg(1,0);

printf("%d\n",f[1][m]);

return 0;

}

提高組(計數)

題目鏈結 類題 氣泡排序 求長度為 n 的排列中滿足最長下降子串行長度不超過 2 且符合 p x y 的排列數。n le 10 7,t le 10 6 題意轉化 不存在三個點,使得左邊的點比中間大,右邊的點比中間小。我們要知道乙個 trick 從大到小 從小到大列舉數,嘗試將其插入當前排列,並使之合...

2018 07 08 2018提高組 模擬C組

fj準備教他的奶牛彈奏一首歌曲,歌曲由n 1 n 50,000 種音節組成,編號為1到n,而且一定按照從1到n的順序進行彈奏,第i種音節持續b i 1 b i 10,000 個節拍,節拍從0開始計數,因此從節拍0到節拍b 1 1彈奏的是第1種音節,從b 1到b 1 b 2 1彈奏的是第2種音節,依此...

NOIP提高組 矩陣

在麥克雷的面前出現了乙個有n m個格仔的矩陣,每個格仔用 或 表示,表示這個格仔可以放東西,則表示這個格仔不能放東西。現在他拿著一條1 2大小的木棒,好奇的他想知道對於一些子矩陣,有多少種放木棒的方案。因為棍子是1 2的,所以很容易就能發現,兩個被分割的塊,除了跨越兩個塊擺放木棍的方案數會對答案有影...