【9.12模拟赛T2】序列【DP】

本文详细解析了1138.序列问题,这是一个关于寻找满足特定条件的整数序列数量的问题。通过动态规划的方法,我们构建了一个算法来解决这个问题,并提供了完整的代码实现。该算法首先初始化所有可能的序列起点,然后通过递推公式计算所有可能的序列数目,最后输出满足条件的序列总数。
摘要由CSDN通过智能技术生成

1138.序列

时间限制:1000MS
内存限制:128000KB

题目描述

    一个长度为k的整数序列b1,b2,…,bk(1≤b1≤b2≤…≤bk≤N)称为“好序列”当且仅当后一个数是前一个数的倍数,即bi+1是bi的倍数对任意的i(1≤i≤k-1)成立。
   给定N和k,请算出有多少个长度为k的“好序列”,答案对1000000007取模。

输入

输入共1行,包含2个用空格隔开的整数N和k。

输出

输出共1行,包含一个整数,表示长度为k的“好序列”的个数对1000000007取模后的结果。

输入样例

3 2

输出样例

5

分析:

D P DP DP
p p p j j j的约数 f [ i ] [ j ] f[i][j] f[i][j]表示前 i i i为确定且末位为 j j j
动态能量转移方程
f [ i + 1 ] [ j ∗ p ] = ( f [ i + 1 ] [ j ∗ p ] + f [ i ] [ j ] ) f[i+1][j*p]=(f[i+1][j*p]+f[i][j]) f[i+1][jp]=(f[i+1][jp]+f[i][j])% 1000000007 1000000007 1000000007
读好题就好了

CODE:

#include<iostream>
#include<cstdio>
#include<algorithm>
#pragma GCC optimize(2)
using namespace std;
const int N=2005;
int n,k,f[N][N],ans;
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)
		f[1][i]=1;
	for(register int i=1;i<=k;i++)
		for(register int j=1;j<=n;j++)
			for(register int p=1;p<=n/j;p++)  //约数
				f[i+1][j*p]=(f[i+1][j*p]+f[i][j])%1000000007;  //转移
	for(int i=1;i<=n;i++)
		ans=(ans+f[k][i])%1000000007;  //统计
	printf("%d",ans);
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值