[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 }