首页 > 其他分享 >波动数列

波动数列

时间:2023-03-20 15:35:14浏览次数:41  
标签:le 数列 LL 波动 mod dp Mod

波动数列

[蓝桥杯 2014 省 A] 波动数列

题目描述

观察这个数列:

$1,3,0,2,-1,1,-2, \cdots $。

这个数列中后一项总是比前一项增加 \(2\) 或者减少 \(3\)。

栋栋对这种数列很好奇,他想知道长度为 \(n\) 和为 \(s\) 而且后一项总是比前一项增加 \(a\) 或者减少 \(b\) 的整数数列可能有多少种呢?

输入格式

输入的第一行包含四个整数 \(n,s,a,b\),含义如前面说述。

输出格式

输出一行,包含一个整数,表示满足条件的方案数。由于这个数很大,请输出方案数除以 \(100000007\) 的余数。

样例 #1

样例输入 #1

4 10 2 3

样例输出 #1

2

提示

【样例说明】

这两个数列分别是 2 4 1 3 和 7 4 1 -2。

【数据规模与约定】

对于 \(10\%\) 的数据,\(1 \le n \le 5\),\(0 \le s \le 5\),\(1 \le a,b \le 5\);

对于 \(30\%\) 的数据,\(1 \le n \le 30\),\(0 \le s \le 30\),\(1 \le a,b \le 30\);

对于 \(50\%\) 的数据,\(1 \le n \le 50\),\(0 \le s \le 50\),\(1 \le a,b \le 50\);

对于 \(70\%\) 的数据,\(1 \le n \le 100\),\(0 \le s \le 500\),\(1 \le a,b \le 50\);

对于 \(100\%\) 的数据,\(1 \le n \le 1000\),\(-10^9 \le s \le 10^9\),\(1 \le a,b \le 10^6\)。

题解

不妨设数列首项为\(a_1\),操作数为\(x\),其中\(x = a\)  \(or\)  \(x = -b\),易知\(s=\sum_1 ^n a_1+(i-1)x\), 即$$s=na_1+\frac{n(n-1)}{2}x$$由于\(n, a, b, s\)都是整数,且波动数列为整数数列,则 \(a_1 \in Z\),记 \(z = \frac{n(n-1)}{2}x\),则 \(a_1=\frac{s-z}{n}\),即 \(s\) mod \(n\) = \(z\) mod \(n\). 题目中已给定\(s、n\)的值,那么题意转化为有多少种方案能使得 \(z\) 与 \(s\) 模 \(n\) 同余,并满足数列长度为 \(n\) 项且和为 \(s\). 设 \(dp_{i,j}\) 表示 \(z\) 的前 \(i\) 项的序列和模 \(n\) 后值为 \(j\) 的方案数。

  1. \(z\) 的前 \(i\) 项序列和,即 \(x * (0 + 1 + 2 + ... + i)\) (注:事实上 \(0 + 1 + ... + i\) 不能写成求和的形式,因为 \(x\) 并不是一个确定的自然数,对于某一项我们取\(a\)还是取\(b\)是不一定的,上文推导中记作求和仅仅是为了方便)
  2. 前 \(i\) 项序列和模 \(n\) 为 \(j\),即 \(j=[a_1 + (a_1 + x) + (a_1 + 2x) + ... + (a_1 + (i-1)x)]\) mod \(n\)。

因为\(x = a\)  \(or\)  \(x = -b\),那么第 \(i\) 项将由第 \(i-1\) 项推出,即状态转移方程为:$$dp_{i,j}=dp_{i-1,Mod(j-i·a)} + dp_{i-1,Mod(j+i·b)}$$

  1. \(Mod (x) =\) ( \(x\) mod \(n + n\) ) mod \(n\). 这样能够保证余数是个正数.
  2. \((a \pm b)\) mod \(n\) = ( \(a\) mod \(n\) \(\pm\) \(b\) mod \(n\) ) mod \(n\)
  3. 初始值\(dp_{0,0}=1\)

代码:

#include<cstdio>
typedef long long LL;
const LL N=1e3+3, mod=1e8+7;
LL n,dp[N][N];

int Mod(LL x){return (x%n+n)%n;}

int main(){
	LL s,a,b; 
	scanf("%lld%lld%lld%lld",&n,&s,&a,&b);
	dp[0][0]=1;
	for(LL i=1;i < n; i++)
		for(LL j=0;j < n; j++)
			dp[i][j]=(dp[i-1][Mod(j-a*i)]+dp[i-1][Mod(j+b*i)])%mod;
	printf("%lld",dp[n-1][Mod(s)]);
}

标签:le,数列,LL,波动,mod,dp,Mod
From: https://www.cnblogs.com/parallel-138/p/17236461.html

相关文章

  • [第十届蓝桥杯省赛C++B组]等差数列
    来源:第十届蓝桥杯省赛C++B组算法标签:数论最大公约数题目描述数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N个整数。现在给......
  • 【视频】随机波动率SV模型原理和Python对标普SP500股票指数预测|数据分享|附代码数据
    全文链接:http://tecdat.cn/?p=22546 最近我们被客户要求撰写关于随机波动率SV模型的研究报告,包括一些图形和统计输出。什么是随机波动率?随机波动率(SV)是指资产价格的......
  • 兔子问题,斐波那契数列(for循环,数组)
    古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?程序分析:兔子的规律为......
  • PAT Basic 1030. 完美数列
    PATBasic1030.完美数列1.题目描述:给定一个正整数数列,和正整数\(p\),设这个数列中的最大值是\(M\),最小值是\(m\),如果\(M≤mp\),则称这个数列是完美数列。现在给定......
  • P8682 [蓝桥杯 2019 省 B] 等差数列
    P8682[蓝桥杯2019省B]等差数列[蓝桥杯2019省B]等差数列题目描述数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中N......
  • template参数列表
    template的基本使用在C++笔记(3)中说明,这里去探讨一下template的一些高级用法@目录一、概念二、通式三、优劣及适用情况四、技术细节五、其他范例一、模板形参概述二、类型......
  • 斐波那切数列
     C++写的斐波那切数列 #include<iostream>#include<fstream>#include<cstdlib>/*斐波那切数列*/intmain(){ intcount=10; intx=0; inty=1; ......
  • 斐波那契数列
    原理第三个数等于前面两个数之和F(0)=0,F(1)=1,F(N)=F(N-1)+F(N-2)如:0,1,1,2,3,5,8,13代码deffib(n): c,a,b=0,0,1 whilec<n: a,b......
  • 413.等差数列划分
    等差数列划分如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列。例如,[1,3,5,7,9]、[7,7,7,7]和[3,-1,-5,-9]都是等差数列。给你一个......
  • 【DP】LeetCode 剑指 Offer 10- I. 斐波那契数列
    题目链接剑指Offer10-I.斐波那契数列思路递推,思路可以参考剑指Offer10-II.青蛙跳台阶问题代码classSolution{publicintfib(intn){inta......