小 C 的 01 序列
涉及知识点:
- 递推
solution:
- (从1月29到今天,每日一题已经和大家陪伴了整整一个季度,继续加油吧,各位~)
- (这道题的做法很多,简述个人的做法)
- (先看一下前4项:)
- (0)
- (01)
- (0110)
- (01101001)
- (发现每一项的前半部分等于上一项,后半部分等于前半部分取反)
- (那递推式就很好写了:)
- (00的个数 = 上一项00的个数+上一项11的个数)
- (01的个数 = 上一项01的个数+上一项10的个数)
- (10的个数 = 上一项10的个数+上一项01的个数)
- (11的个数 = 上一项11的个数+上一项00的个数)
- (写完发现还是少了点什么,举个例子,0110,我们只统计了01和10,漏掉了中间的11)
- (所以少算的那一部分就是最中间新增的11)
- (多写几项不难发现,当n为偶数,最中间的是11,n为奇数,最中间的是01)
std:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod = 998244353;
const int maxn = 1e5 + 5;
ll f[maxn][4];
int main(){
int n;
cin>>n;
f[1][1] = 1;
for(int i=2;i<=n;i++){
f[i][0] = (f[i-1][0] + f[i-1][3])%mod;
f[i][1] = (f[i-1][1] + f[i-1][2])%mod;
f[i][2] = (f[i-1][2] + f[i-1][1])%mod;
f[i][3] = (f[i-1][3] + f[i-1][0])%mod;
if(i%2 == 0)
f[i][3] += 1;
else
f[i][1] += 1;
}
for(int i=0;i<4;i++)
cout<<f[n][i]<<" ";
cout<<endl;
return 0;
}