AT5661-[AGC040C]Neither AB nor BA【模型转换】
生活随笔
收集整理的這篇文章主要介紹了
AT5661-[AGC040C]Neither AB nor BA【模型转换】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.com.cn/problem/AT5661
題目大意
一個包含A,B,CA,B,CA,B,C的序列,每次可以選擇相鄰的兩個除了ABABAB和BABABA的刪去。
求有多少個長度為NNN的序列可以刪完。
1≤N≤1071\leq N\leq 10^71≤N≤107
解題思路
因為每次是刪除一個奇數(shù)位置和一個偶數(shù)位置,如果我們把所有偶數(shù)位置的取反,那么就變成了不能刪除AAAAAA和BBBBBB。
然后如果在邊上AAA一定可以刪(除非到邊界),也就是AAA的數(shù)量不能超過n2\frac{n}{2}2n?,同理BBB也是。
然后減去AAA大于的或者BBB大于的就好了(因為只能有一個大于)
時間復(fù)雜度O(n)O(n)O(n)
code
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=1e7+10,P=998244353; ll n,pw[N],inv[N],fac[N],ans; ll C(ll n,ll m) {return fac[n]*inv[m]%P*inv[n-m]%P;} signed main() {scanf("%lld",&n);pw[0]=ans=inv[1]=1;for(ll i=2;i<=n;i++)inv[i]=P-(P/i)*inv[P%i]%P;inv[0]=fac[0]=1;for(ll i=1;i<=n;i++)fac[i]=fac[i-1]*i%P,inv[i]=inv[i-1]*inv[i]%P;for(ll i=1;i<=n;i++)ans=ans*3%P,pw[i]=pw[i-1]*2%P;for(ll i=n/2+1;i<=n;i++)ans=(ans-pw[n-i]*C(n,i)%P*2%P+P)%P;printf("%lld\n",ans);return 0; }總結(jié)
以上是生活随笔為你收集整理的AT5661-[AGC040C]Neither AB nor BA【模型转换】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CF573D-Bear and Cava
- 下一篇: 2020年二建报名时间 报考2020年二