51nod1514 美妙的序列 分治NTT

2021-10-08 09:25:18 字數 1078 閱讀 7779

顯然,不合法的情況要存在序列被分成值域為 $[1,i]$ 與 $[i+1,r]$ 兩部分.  

不妨採用容斥的方法來減去所有不合法的情況.    

令 $f[i]$ 表示 $1$ ~ $i$ 構成的合法序列數目.  

那麼不合法的情況一定可以表示為 $f[j] \times (i-j)!$ 即前 $j$ 個數組成的連通塊合法,然後第乙個不合法位點為 $(j,j+1)$  

由於每一次第乙個不合法位點不同,所以不會減多.   

$f[n]=n!-\sum_^ f[j] \times (n-j)!$ 這個式子用分治 ntt 加速就好了.    

code:   

#include #include #include #define n 100007

#define ll long long

#define mod 998244353

#define setio(s) freopen(s".in","r",stdin)

using namespace std;

int n;

int fac[n],f[n],g[n],a[n<<2],b[n<<2];

void init()

return tmp;

} int get_inv(int x)

void ntt(int *a,int len,int op)

for(int l=1;l>1,lim,s1=0,s2=0;

solve(l,mid);

for(int i=l;i<=mid;++i) a[s1++]=f[i];

for(int i=0;i<=r-l;++i) b[s2++]=g[i];

for(lim=1;lim<(s1+s1);lim<<=1);

for(int i=s1;i47)

return x;

}int main()

solve(1,n);

int t=rd(),x,y;

while(t--)

return 0;

}

51nod 1514 美妙的序列

某個1 n的排列如果滿足 在1 n 1 這些位置後面將序列斷開,使得總可以從右邊找到乙個數,並且該數不大於左邊的所有數,則稱該序列為 美妙的 給出n,求長度為n的 美妙的序列 的數量。首先第一步,讀懂題!換句話說,就是當左邊所有數都比右邊的最小值小時不合法。那麼就按照題意dp,考慮容斥,列舉從哪個點...

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小 都滿...

51nod1287 加農炮 構造順序序列 二分查詢

說出來你可能不信,今天又被秀了。1287 加農炮 codility 乙個長度為m的正整數陣列a,表示從左向右的地形高度。測試一種加農炮,炮彈平行於地面從左向右飛行,高度為h,如果某處地形的高度大於等於炮彈飛行的高度h a i h 炮彈會被擋住並落在i 1處,則a i 1 1。如果h a 0 則這個炮...