[ARC071F] Infinite Sequence

题目描述:

定义 n可爱序列 指无限长的由 {1,2...,n} 组成的序列。同时 a1,a2...满足以下条件:

1.第 n 个及以后的元素是相同的,即若 i,jn,ai=aj

2.对于每个位置 i,紧随第 i 个元素后的 ai 个元素是相同的,即若 i<j<ki+ai,aj=ak

输入 n,请输出 n可爱序列的数量 mod109+7

n106

思路:

首先我们先对这个题目进行一些转换:
1. n后的每个数都应与n相同
2. 若第i位为x,则[i+1,i+x]均=x

对于一个计数类型的题目,要么选择组合,要么就是用 Dp。显然这里 Dp可能更加方便一点

我们观察一下题目中的条件,发现所有的范围都是往后延申的,所以这启发我们从后往前Dp。
dpi 表示当前填到了第 i 位,其中 in 位的方案数位多少
然后我们进行分类讨论:

  1. ai=1&ai+11ai+1=1dpi+=dpi+1
  2. ai1&ai+11 则序列形如abbbbbbb,则 dpi=(n1)×(n1)
  3. ai1&ai+1=1 则序列形如 a11111X,则 dpi=x=2nfi+x+1

其实是一个不错的计数,但是不能算很难的那种。

点击查看代码
#include<bits/stdc++.h> using namespace std; #define int long long inline int read(){ int x=0,f=1; char c=getchar(); while(!isdigit(c)){ if(c=='-')f=-1; c=getchar(); } while(isdigit(c)){ x=(x<<1)+(x<<3)+(c^48); c=getchar(); } return x*f; } const int maxn=1e6+5; const int mod=1e9+7; int n; int dp[maxn]; signed main(){ n=read(); dp[n]=n; dp[n-1]=n*n%mod; int sum=0; for(int i=n-2;i>=1;i--){ sum=(sum+dp[i+3])%mod; dp[i]=(dp[i]+dp[i+1])%mod; dp[i]=(dp[i]+(n-1)*(n-1)%mod)%mod; dp[i]=(dp[i]+sum+i+1)%mod; } cout<<dp[1]<<endl; return 0; }

__EOF__

本文作者Candycar
本文链接https://www.cnblogs.com/Candycar/p/17783731.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Candycar  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示