题解:P16450 [XJTUPC 2026] 但是什么也不会改变 3
Jesper_OIer · · 题解
题目大意
定义
- 序列元素两两不同,均属于集合
\{1,2,\dots,n\} ; - 对任意
3\le i\le m ,有[P_i<P_{i-1}]\ne [P_i<P_{i-2}] 。
求:
数据范围:
题意转化
条件等价于:序列从第三位开始升降严格交替
任意
数学推导
从
答案:
利用二项式定理化简:
减去
最终公式:
做法
- 公式法:直接用通项公式,通过快速幂计算
3^n ,再乘上4 在模998244353 下的逆元即可; - 组合法:预处理阶乘、排列数、阶乘逆元,枚举
m\in[3,n] 累加贡献。
喜闻乐见的 AC 代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5,M=998244353;
using ll=long long;
ll f[N],p[N],r[N];
ll q(ll a,ll b){ll c=1;for(;b;b>>=1,a=a*a%M)if(b&1)c=c*a%M;return c;}
int main(){
int n;cin>>n;
f[0]=1;for(int i=1;i<=n;i++)f[i]=f[i-1]*i%M;
p[0]=1;for(int i=1;i<=n;i++)p[i]=p[i-1]*(n-i+1)%M;
r[n]=q(f[n],M-2);for(int i=n;i;i--)r[i-1]=r[i]*i%M;
ll a=0;
for(int i=3;i<=n;i++){
ll t=p[i]*r[i]%M;
a=(a+t)%M;
}
cout<<a*2%M;
}