0%

ARC071F Infinite Sequence

略水的F题

考虑如果有两个相邻的数字都不是 11 那么就无限套娃下去了,即 abbbabbb\dots

从这个方向下手设 $dp_i $ 是 [i,n][i,n] 填完的方案数

那当 ii11 就是 dpi+=dpi+1dp_i+=dp_{i+1}

如果是无限套娃那这两个位从 [2,n][2,n] 里随便填 dpi+=(n1)2dp_i+=(n-1)^2

ii 填非 11 但是 i+1i+111 就是 a111ablablaa\underbrace{111\dots}_ablabla

所以对于每一个选择 xx 就是 dpi+=dpi+x+1dp_{i}+=dp_{i+x+1}

初始值 dpn=n,dpn1=n2dp_n=n,dp_{n-1}=n^2

然后后缀和优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;
const int N = 1000010;
typedef long long ll;
const ll mod = 1e9 + 7;
ll dp[N];
ll sum;
ll n;
int main() {
cin >> n;
dp[n] = n;
dp[n - 1] = (n * n) % mod;
for (int i = n - 2; i >= 1; i--) {
sum += dp[i + 3];
sum %= mod;
dp[i] = dp[i + 1];
dp[i] += (n - 1) * (n - 1) % mod;
dp[i] %= mod;
dp[i] += sum;
dp[i] %= mod;
dp[i] += i + 1 % mod;
dp[i] %= mod;
}
cout << dp[1] % mod;
return 0;
}
// Asusetic eru quionours