51nod 1514 美妙的序列

2021-08-18 23:56:42 字數 1058 閱讀 9188

某個1~n的排列如果滿足:

在1~n-1 這些位置後面將序列斷開,使得總可以從右邊找到乙個數,並且該數不大於左邊的所有數,則稱該序列為「美妙的」。

給出n,求長度為n的「美妙的序列」的數量。

首先第一步,讀懂題!換句話說,就是當左邊所有數都比右邊的最小值小時不合法。

那麼就按照題意dp,考慮容斥,列舉從哪個點開始不合法,得到f[

n]=n

!−∑n

−1i=

1f(i

)∗(n

−i)!

f [n

]=n!

−∑i=

1n−1

f(i)

∗(n−

i)

!注意到這是個卷積形式,直接分治fft/多項式求逆即可。

code:

#include

#include

#include

#include

#define ll long long

using

namespace

std;

const ll p=998244353,yg=3;

ll bin[400000],a[400000],b[400000],c[400000],n;

ll pow(ll a,ll b)

return ans;

}void ntt(ll *a,ll n,ll op)

pol_inv((deg+1)>>1,a,b);

ll n=1;while(n1) n<<=1;

copy(a,a+deg,c);fill(c+deg,c+n,0);

ntt(c,n,1);ntt(b,n,1);

for(ll i=0;i2-b[i]*c[i]%p)*b[i]%p;

b[i]+=b[i]<0?p:0;

}ntt(b,n,-1);fill(b+deg,b+n,0);

}ll fac[100010],inv[100010];

void pre()

int main()

}

51nod1514 美妙的序列 分治NTT

顯然,不合法的情況要存在序列被分成值域為 1,i 與 i 1,r 兩部分.不妨採用容斥的方法來減去所有不合法的情況.令 f i 表示 1 i 構成的合法序列數目.那麼不合法的情況一定可以表示為 f j times i j 即前 j 個數組成的連通塊合法,然後第乙個不合法位點為 j,j 1 由於每一次...

NTT 51nod 1514 美妙的序列

題意 1 n 的全排列中,有多少個排列滿足任意從中間切成兩段後,左邊段的最大值大於右邊段的最小值?例如 n為3時有3種 2 3 1 3 1 2 3 2 1 解釋 比如 2 3 1 2 3 1 1比2小 2 3 1 1比2小 都滿足上面的條件。3 2 1 3 2 1 1比3小 32 1 1比3小 都滿...

51nod 序列分解(dfs)

1400 序列分解 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 小刀和大刀是雙胞胎兄弟。今天他們玩乙個有意思的遊戲。大刀給小刀準備了乙個長度為n的整數序列。小刀試著把這個序列分解成兩個長度為n 2的子串行。這兩個子串行必須滿足以下兩個條件 1.他們不能相互重疊...