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 ;
}

最新文章

  1. kettle系列-3.kettle读取数据库资源库很慢的优化
  2. Python实例3
  3. android自动化之monkeyrunner
  4. make的控制函数(error,warning)
  5. Java常用jar包用途
  6. 如何正确的使用Lerp In Unity
  7. (一)学习JavaScript之setTimeout方法
  8. sort,uniq命令
  9. Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
  10. PAT 团体程序设计天梯赛-练习集 L1-020. 帅到没朋友
  11. overflow-x: scroll;横向滑动详细讲解
  12. [easyUI] 树形菜单 tree
  13. python中和生成器协程相关的yield之最详最强解释,一看就懂(一)
  14. FreeBSD ZFS
  15. Spark学习笔记——构建分类模型
  16. winSocket编程(九)重叠IO
  17. Linux - awk 文本处理工具一
  18. exception java.lang.OutOfMemoryError: Java heap space
  19. react + antiDesign开发中遇到的问题记录
  20. laravel中单独获取一个错误信息的方法

热门文章

  1. [LeetCode] 307. Range Sum Query - Mutable 解题思路
  2. 百度之星-day1-1003-度度熊剪纸条
  3. Sprint 冲刺第三阶段第3-5天
  4. 剑指offer:变态跳台阶
  5. Linux (centos7) 防火墙命令
  6. Win10 1803 升级之后无法使用 共享目录的解决方法
  7. vue-cli webpack项目npm run dev启动过程
  8. 日志那点事儿——slf4j源码剖析
  9. python 判断变量有没有定义
  10. StringBuilder String string.Concat 字符串拼接速度再议