Codeforces Round #523 (Div. 2) C. Multiplicity
2024-09-21 09:01:05
C. Multiplicity
题目链接:https://codeforc.es/contest/1061/problem/C
题意:
给出一串数,问它的“好序列“有多少。好序列的定义是,首先是一个子序列(顺序可以打乱),其次,序列相应位置的数可以除尽该位置编号。
题解:
这题是dp,我没有想到,主要是状态的定义。
定义dp(i,j):在a1,a2...ai中长度为j的好序列的个数,这样dp转移方程就为:if ai%j==0: dp(i,j)=dp(i-1,j-1)+dp(i-1,j) , else: dp(i,j)=dp(i-1,j) 。
由于二维数组空间太大,又因为状态都是从i-1转移过来,所以可以对空间复杂度进行优化。
代码中,用一个vector来储存ai能放在的位置,这样与对空间复杂度进行优化相配,能更好地逆推。
代码如下:
#include <bits/stdc++.h>
using namespace std; typedef long long ll ;
const int N = ,MOD = 1e9+;
ll dp[N];
int n;
int a[N]; int main(){
scanf("%d",&n);
dp[]=;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
vector <int> pos;
for(int j=;j*j<=a[i];j++){
if(a[i]%j==){
pos.push_back(j);
if(a[i]/j!=j) pos.push_back(a[i]/j);
}
}
sort(pos.begin(),pos.end());
reverse(pos.begin(),pos.end());
for(int i=;i<pos.size();i++){
dp[pos[i]]+=dp[pos[i]-];
dp[pos[i]]%=MOD;
}
}
ll ans = ;
for(int i=;i<=n;i++) ans+=dp[i] , ans%=MOD;
printf("%I64d",ans);
return ;
}
最新文章
- kettle系列-3.kettle读取数据库资源库很慢的优化
- Python实例3
- android自动化之monkeyrunner
- make的控制函数(error,warning)
- Java常用jar包用途
- 如何正确的使用Lerp In Unity
- (一)学习JavaScript之setTimeout方法
- sort,uniq命令
- Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
- PAT 团体程序设计天梯赛-练习集 L1-020. 帅到没朋友
- overflow-x: scroll;横向滑动详细讲解
- [easyUI] 树形菜单 tree
- python中和生成器协程相关的yield之最详最强解释,一看就懂(一)
- FreeBSD ZFS
- Spark学习笔记——构建分类模型
- winSocket编程(九)重叠IO
- Linux - awk 文本处理工具一
- exception java.lang.OutOfMemoryError: Java heap space
- react + antiDesign开发中遇到的问题记录
- laravel中单独获取一个错误信息的方法
热门文章
- [LeetCode] 307. Range Sum Query - Mutable 解题思路
- 百度之星-day1-1003-度度熊剪纸条
- Sprint 冲刺第三阶段第3-5天
- 剑指offer:变态跳台阶
- Linux (centos7) 防火墙命令
- Win10 1803 升级之后无法使用 共享目录的解决方法
- vue-cli webpack项目npm run dev启动过程
- 日志那点事儿——slf4j源码剖析
- python 判断变量有没有定义
- StringBuilder String string.Concat 字符串拼接速度再议