Welcome to Liukejie's b|

liukejie

园龄:1年8个月粉丝:5关注:11

题解:AT_arc071_d [ARC071F] Infinite Sequence

题意

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

  • n 项及之后的所有项都相等

  • 对于每一个 ai,满足 ai+1ai+ai 个数都相同。

问你有多少种方案 mod109+7

思路

看到问方案,首先想到 dp

那么设 fi 表示对于每一位 a[1,n] 有多少种方案,则可以得到

fi=fi1+(n1+fi3)+(n1+fi4)+(n1+fin1)

加上前缀和优化一下之后的式子就变成了

fi=fi1+sumi3+n2ni+2

其中 f1=n,f2=n2sum 数组用来求 f 数组的前缀和,需要预处理一下,注意 mod109+7

综上所述,时间负责度为 O(n)

代码如下

#include <bits/stdc++.h>
#define int long long
using namespace std;
#define rep(i, l, r) for(int i = l; i <= r; ++ i)
#define per(i, r, l) for(int i = r; i >= l; -- i)
const int N = 1e6 + 10, mod = 1e9 + 7;
int f[N], sum[N], n;
main() 
{
	scanf("%lld", &n);
	f[0] = 1; f[1] = n; f[2] = (n * n) % mod;
	sum[0] = 1;
	sum[1] = (f[0] + f[1]) % mod;
	sum[2] = ((f[0] + f[1]) % mod + f[2]) %mod;
	rep(i, 3, n) 
	{
		f[i] = ((f[i - 1] + sum[i - 3]) % mod + n * (n - 1) - i + 2) % mod;
		sum[i] = (sum[i - 1] + f[i]) % mod;
	}
	printf("%lld", f[n] % mod);
	return 0;
}
posted @   liukejie  阅读(4)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起