[ARC071F] Infinite Sequence

29 篇文章 0 订阅
6 篇文章 0 订阅
一道数学建模题目,要求构造一个无限序列,其中第n个数与后续所有数相同,并且每个数x后面x个数也与其相同。通过动态规划(dp)求解方案数,转移状态包括当当前位为1、非1且后一位非1、非1但后一位为1的情况,时间复杂度为O(n)。
摘要由CSDN通过智能技术生成

题意

让你构造一个每个数为1~n的无限长的序列,满足:

  1. 第n个数与它后面的数都相同

  2. 对于每一个数x,它和后面的x个数都相同。

问你有多少种方案。

题解

考虑dp,设 f [ i ] f[i] f[i]代表第i~n位都填好的方案数,倒着dp。

转移分3种情况:

当第i位是1时, f [ i ] + = f [ i + 1 ] f[i]+=f[i+1] f[i]+=f[i+1]

当第i位不是1并且第i+1位也不是1时,这个序列就只能长成 x y y y y y y y y y y y y . . . xyyyyyyyyyyyy... xyyyyyyyyyyyy...的样子了,其中 x x x y y y可以填任意非1数,所以 f [ i ] + = ( n − 1 ) ∗ ( n − 1 ) f[i]+=(n-1)*(n-1) f[i]+=(n1)(n1).

当第i位不是1但是第i+1位是1时,这个序列就长成 x 11111 S x11111S x11111S的样子了,所以对于每一个 x x x f [ i ] + = f [ i + x + 1 ] f[i]+=f[i+x+1] f[i]+=f[i+x+1](如果 i + x + 1 > n i+x+1>n i+x+1>n那么 f [ i + x + 1 ] = 1 f[i+x+1]=1 f[i+x+1]=1),维护一个 f f f的后缀和就可以做到 O ( 1 ) O(1) O(1)转移了。

时间复杂度: O ( n ) O(n) O(n)

代码:

#include <bits/stdc++.h>
using namespace std;

#define MAXN 1000010
#define mod 1000000007

int n,f[MAXN],add;

int main()
{
    scanf("%d",&n);
    f[n]=n;
    f[n-1]=(long long)n*n%mod;
    for(int i=n-2;i>=1;--i)
    {
        add=(add+f[i+3])%mod;
        f[i]=f[i+1];
        f[i]=(f[i]+(long long)(n-1)*(n-1)%mod)%mod;
        f[i]=(f[i]+add)%mod;
        f[i]=(f[i]+i+1)%mod;
    }
    printf("%d\n",f[1]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值