【輸入輸出樣例 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的,所以很容易就能發現,兩個被分割的塊,除了跨越兩個塊擺放木棍的方案數會對答案有影...