ARC071F Infinite Sequence

Link
若存在两个不为\(1\)且相邻的数,那么后面的数都会相等。
那么设\(f_i\)表示填\([i,n]\)位置的方案数,边界为\(f_n=n,f_{n-1}=n^2\)
考虑如何进行转移。
\(\text{1:}\)填一个\(x(x\in(1,n-i])\)然后后面接\(x\)\(1\),即\(f_i\leftarrow\sum\limits_{j=i+3}^n f_j\)
\(\text{2:}\)填一个\(x(x\in(n-i,n])\)然后后面接\(n-i\)\(1\),即\(f_i\leftarrow i+1\)
\(\text{3:}\)只填一个\(1\),即\(f_i\leftarrow f_{i+1}\)
\(\text{4:}\)在第\(i\)\(i+1\)位填两个大于\(1\)的数,即\(f_i\leftarrow(n-1)^2\)
最后的答案就是\(f_1\)

#include<cstdio>
int n,f[1000007],P=1000000007;
int main()
{
    scanf("%d",&n),f[n]=n,f[n-1]=1ll*n*n%P;
    for(int i=n-2,s=0;i>0;--i) (s+=f[i+3])%=P,f[i]=(f[i+1]+1ll*(n-1)*(n-1)+s+i+1)%P;
    printf("%d",f[1]);
}
posted @ 2020-05-03 16:29  Shiina_Mashiro  阅读(140)  评论(0编辑  收藏  举报