[atARC071F]Infinite Sequence

注意到当$a_{i}\ne 1$且$a_{i+1}\ne 1$,那么$\forall i<j,a_{j}=a_{i+1}$(证明的话简单归纳就可以了)

令$f_{i}$表示在题中条件下,还满足$\forall i\le j,a_{j}=a_{i}$的方案数,转移考虑所填的$a_{1}$和$a_{2}$:

1.$a_{1}=1$,此时相当于没有限制,即$f_{i-1}$

2.$a_{1}>1$且$a_{2}=1$,此时即限制一直到$a_{1}+1$都要是1,接下来任意,即$f_{i-(a_{1}+1)}$

3.$a_{1}>1$且$a_{2}>1$,那么共有$(n-1)^{2}$种(任选),之后唯一

(特别的,对于第2种转移,允许$a_{1}+1\ge i$,此时即为1)

转移前缀和优化即可,时间复杂度为$o(n)$

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 1000005
 4 #define mod 1000000007
 5 int n,f[N],sum[N];
 6 int main(){
 7     scanf("%d",&n);
 8     f[1]=sum[1]=n;
 9     for(int i=2;i<=n;i++){
10         f[i]=(sum[i-1]-f[i-2]+mod+1LL*(n-1)*(n-1)+n+2-i-(i==2))%mod;
11         sum[i]=(sum[i-1]+f[i])%mod;
12     } 
13     printf("%d ",f[n]);
14 }
View Code

 

posted @ 2021-02-08 22:34  PYWBKTDA  阅读(75)  评论(0编辑  收藏  举报