zoukankan      html  css  js  c++  java
  • [atARC071F]Infinite Sequence

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

    令$f_{i}$表示在题中条件下,还满足$forall ile 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}+1ge 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
  • 相关阅读:
    C++ 中复杂的声明
    指向成员的指针
    指针与引用的操作符
    char指针
    软件测试
    网络应用层协议
    BOOL,int,float,指针变量与零值比较的if语句
    有关单向链表的题目
    main方法执行之前,做什么事
    C++复制控制
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/14391341.html
Copyright © 2011-2022 走看看