顯然,不合法的情況要存在序列被分成值域為 $[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 則這個炮...