某個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.他們不能相互重疊...