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]);
}

猜你喜欢

转载自www.cnblogs.com/cjoierShiina-Mashiro/p/12822356.html
今日推荐