Codeforces Round #523 (Div. 2) C. Multiplicity 【dp】

下载Python3.10的相关方法及问题解决 下载Python3.10的相关方法及问题解决 报错unable to locate package python3.10-dev以及subprocess.CalledProcessError: Command ‘(‘lsb_release‘, ‘-a‘)‘ returned non-zero exit status 1问题解决 阅读详情

题目链接:http://codeforces.com/contest/1061/problem/C

思路:

像类似这种求有衔接关系的数列要第一时间想到  dp[ i ] = dp[ i ] + dp[ i - 1 ] 这种状态的dp,为什么?

假设我要让一个原数组下标为 4的数变成下标为 3 的数,那么要想数列存在,那么 必须存在 至少一个 长度为2的数列,在这些数列的尾部加上这个原数组下标为4的数才能构成一个长度为 3 的数列,由此对应的长度为3的个数就是长度为2的个数,加上本身存在的长度为 3的个数,所以得到  dp[ i ] = dp[ i ] + dp[ i - 1] ;

如何确定一个数放在下标 小于原下标的位置(因为数列只能通过删除某一个数才能改变原数组下标,所以数组下标只可能小不可能大于自身)

只要求出当前这个数的所有约数,对应的约数就是能放置的位置,通过 n*sqrt (n) 时间复杂度的算法能够求出所有数的个数。

这里有几点需要注意的:

1,约数放置到vector里面的时候,一定要按顺序放置,通过stack的辅助代替sort的使用,减少时间复杂度,为什么要按顺序放置,当你在遍历约数的时候,必须要从大到小遍历,如果你按小到大,或者随便遍历,当你更新约数大的dp,有可能会使用到你刚刚才更新过的约数小的dp,这时候结果就是错的了(自己纸上模拟一下就知道了,跟背包空间优化的逆序遍历dp是一样的道理,如果你用二维dp自然就不用考虑这个)

2,如果当前遍历到的约数比原数组的最大下标还要大时直接不考虑。

之前一直觉得用n*sqrt(n) 的算法求约数会超时,写到后面才发现,遍历dp的时候,我们并不需要从头到尾逐个更新dp的值,因为对应的约数就是dp的位置了,所以直接遍历约数就行了,一个数的约数一般不会太大,所以时间是很充裕的。

#include <bits/stdc++.h>

using namespace std;

const int Maxn = 1e5+10;
const int Mod = 1e9+7;

int b[Maxn], dp[Maxn];
vector <int> a[Maxn];
stack <int> sk;

void solve (int x) { // 约数打表
    int tmp = b[x];
    for (int i = 1; i*i <= tmp; ++i) {
        if (tmp % i != 0) continue;
        if (i*i == tmp) {
            a[x].push_back (i);
        } else {
            a[x].push_back (i); sk.push(tmp/i);
        }
    }
    while (!sk.empty()) {  // 保证数列是从小到大排列的,为dp的逆序
        a[x].push_back (sk.top());
        sk.pop();
    }
}

int main (void)
{
    int n, tmp;
    scanf ("%d", &n);
    for (int i = 0; i < n; ++i) {
        scanf ("%d", &b[i]);
        solve (i);
    }
    dp[0] = 1;
    for (int i = 0; i < n; ++i) {
        int m = a[i].size();
        for (int j = m-1; j >= 0; --j) {  // 从大到小遍历更新dp
            int tmp = a[i][j];
            if (tmp <= n && dp[tmp-1]) { // 保证约数在n范围内,超出n的约数不考虑
                dp[tmp] = (dp[tmp-1]+dp[tmp]) % Mod;
            }
        }
    }
    int ans = 0;
    for (int i = 1; i <= n; ++i) {
        ans = (ans + dp[i]) % Mod;
    }
    printf ("%d\n", ans);
    return 0;
}

 

霜冰优化算法(RIME)详解:从自然现象到智能优化 霜冰优化算法(RIME)是一种新型元启发式优化算法,灵感源于自然界中霜冰的形成过程。该算法通过模拟软霜和硬霜的不同生长特性,实现了高效的全局探索和局部开发平衡。RIME算法包含三个核心机制:软霜搜索策略模拟随机覆盖特性实现全局探索;硬霜穿刺机制模拟定向生长特性进行局部开发;正向贪婪选择机制确保解的持续优化。与遗传算法、粒子群算法相比,RIME具有参数少、收敛快、自适应平衡等优势,特别适合处理高维复杂优化问题。算法已在工程优化、机器学习等领域获得广泛应用,发表一年内即成为高被引论文。 阅读详情

相关推荐

Applied Intelligence投稿经验分享(正在投稿中)

这几天在投稿Applied Intelligence这个期刊,过程很曲折,反反复复,因此写一篇经验分享,希望能记录一下自己的过程,也能给其他人一些帮助(可以在评论区讨论),提醒一下,一定要写一些声明,不会写、不知道写啥就看第四章的第二个问题。

weixin_55988068的博客 1万+

Problem——C. Alarm Clocks Everywhere——Codeforces

time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard output Ivan is going to sleep now and wants to set his alarm clock. There will be many necessary even...

Foolishman的博客 552

STM32 WinUSB免驱实现:从DFU模式到高速通信的实战指南

本文详细介绍了STM32 WinUSB免驱实现方案,从DFU模式到高速通信的完整实战指南。通过修改设备描述符、添加BOS描述符和实现WCID描述符集,开发者可以轻松实现即插即用的USB设备,无需额外安装驱动。文章还提供了性能优化技巧和实际应用案例,帮助开发者快速部署高效稳定的USB通信方案。

weixin_29171087的博客 422

Codeforces Round #523 (Div. 2)C. Multiplicity(欧拉函数改改+dp)

传送门 题意:给出一个数组a,然后可以移除一些元素变成数组b,这个数组b有个规定是:如果第i个元素可以整除i,那么这个数组b就是好的,现在问数组a可以构造出多少个数组b 样例解释一: 5 2 2 1 22 14 可以构成   {2}, {2,2} {2,22}, {2,14}, {2}, {2,22}, {2,14}, {1}, {1,22}, {1,14}, {22}, {22,...

肘子的博客 638

微信h5 支付,已经获得weixin://wap/pay?prepayid,但是无法调起微信客户端支付

结果几个接口,最终获得到到一直包含调起微信客户端的支付链接 但是直接打开这个页面,却不能调起微信客户端支付,原因是,在打开新页面的时候,需要设置a.rel = "noreferrer"; <body> <a href="javascript:void(0)" onclick="openNewWindowNoreferrer(this)">点击支付</a&...

qq_31683775的博客 4万+

基于Simulink的魔术公式轮胎动力学仿真

本篇博文主要用来记录汽车系统动力学课程的学习,仅供课程阶段参考,与实际工程应用还有较大距离。基于Simulink的魔术公式轮胎动力学仿真本实例主要有以下任务。1.建立魔术公式轮胎动力学仿真模型。2.绘制不同载荷下的轮胎纵向力—滑动率关系曲线。3.绘制不同载荷下的轮胎侧向力—侧偏角关系曲线。4.绘制不同载荷下的轮胎回正力矩—侧偏角关系曲线。提示:以下是本篇文章正文内容,下面案例可供参考。

shy_201992的博客 6940

[codeforces1061C]Multiplicity

C. Multiplicity time limit per test : 3 seconds memory limit per test : 256 megabytes You are given an integer array a1,a2,…,ana_1,a_2,…,a_na1​,a2​,…,an​. The array bbb is called to be a subsequence o...

dxyinme-Zz 1154

高德地图+Three.js实战:手把手教你打造数字农场3D可视化大屏(附完整源码)

本文详细介绍了如何利用高德地图JS API与Three.js技术栈,构建一个功能强大的数字农场3D可视化大屏。文章从技术选型、架构设计出发,深入讲解了坐标对齐、图层管理、性能优化等核心工程实践,并提供了完整的模块化代码示例,旨在为智慧农业及类似场景的3D地理可视化项目提供一套可复用的解决方案。

k8s6orchestrator的博客 890

C. Multiplicity

链接 [http://codeforces.com/contest/1061/problem/C] 题意 给你一个数组,让你找有多少个子串(并非连续,但相对位置不能换),满足bi%i==0; 分析 dp,直接先把ai的所有因子抠出来,并从小到大排序(这个很重要),然后dp[i]表示到当前这个数字,子串 长度为i的有多少个,很显然长度为i的依赖于前面的数字长度为i-1的子串数量,所以dp[vec[i...

weixin_30906671的博客 150

lammps剪切模拟的三种实现方法

本文介绍了LAMMPS分子动力学模拟中三种剪切方法:fix deform全局盒子剪切、速度边界剪切和外力加载剪切。fix deform通过改变盒子形状实现均匀剪切,适合宏观力学参数计算;速度边界剪切通过固定边界原子施加速度模拟非均匀剪切,适合界面摩擦研究;外力加载剪切则通过施加恒定力研究材料屈服行为。文章详细说明了每种方法的适用场景、核心原理和关键命令,并强调应根据具体研究目标选择合适方法。这些方法为金属、聚合物等材料的剪切模拟提供了实用解决方案,可直接套用文中命令进行建模计算。

lammps_jiayou的博客 65

Windows 11 安装、使用 Git:下载、安装、概念、命令、分支模型

本文详细介绍了在 Windows 11 系统上安装与使用 Git 的完整流程,涵盖从官方或国内镜像下载安装包、关键安装选项配置,到 Git 核心概念(如工作区、暂存区、分支、远程仓库等)的通俗解释。同时梳理了常用命令与五种主流 Git 分支模型(如 Git Flow、GitHub Flow 等),帮助开发者根据项目规模选择合适的工作流,是面向初学者与进阶用户的实用指南。

寒水馨 · 轻量级技术文档 · hanshuixin.org 2389

Codeforces Round #523 (Div. 2) C. Multiplicity (dp)

C. Multiplicity time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output You are given an integer array 

日月 300

双重分组进位跳跃进位链

跳跃进位链

qq_62260432的博客 941

Codeforces Round #523 (Div. 2) C. Multiplicity (DP)

题目链接:https://codeforces.com/problemset/problem/1061/C 题目大意:         给你数组a,下标从1开始,长度为n,现在要你找a的子序列b,使得b数组有如下性质:bi % i == 0。求这样的子序列个数。 解题思路:         令dp[i][j]表示a1~ai中长度为j的符合条件的子序列个数,转移方程如下:         ...

CourierLo的博客 196

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Codeforces Round #523 (Div. 2) C. Multiplicity DP

题意: 给n个整数的数列,你可以从中去掉一些数得到一个新的数列,新的数列是好数列当对于每一个i,a[i] %i == 0。 问你有多少个好数列 解题思路: dp求解,二维的dp很好想,dp[i][j]表示前i个数中 因数为j  的好数列的个数, 最后的答案就是sum(i:1-&gt;n)dp[n][i]    更新也很好想到 但是这样会MLE。注意到其实第一维是可以压缩掉的,那么我...

qq_41668093的博客 208

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【Codeforces Round #523 (Div. 2) C. Multiplicity】 dp+预处理

C. Multiplicity 题意 给你一个n个数的数列,让你构造一个序列,保证每个位置的数字能整除这个位置的下标。问有多少个子序列满足这种做法。 做法 设dp[i]为长度为i的合法子序列的个数,子序列的前后顺序一定在原序列中是一样的,所以我们从左到右dp,对于当前数字的每个因子x,都可以dp[x]+=dp[x+1],因为如果当前数字能整除x,她一定可以放在所有长度为x-1的子序列的后面,但是...

lajiyuan的博客 309

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Codeforces Round #523 (Div. 2) C Multiplicity (DP+动态数组)

Multiplicity time limit per test 3 seconds memory limit per test256 megabytes You are given an integer arraya1,a2,…,ana1,a2,…,an. The arraybbis called to be asubsequenceofaaif it is pos...

暗夜的彩虹的博客 265

Codeforces Round #523 (Div. 2)C. Multiplicity (dp+vector)

题目链接 C - Multiplicity 题意: 给定一个数组{},问这个数组的所有子序列{}中,有多少子序列满足:对于所有的满足 是 的倍数,答案对取模 题解: 先处理出的所有因数。 接着就是DP 长度为j的方案数 所以 j可以通过枚举的因数得到 别忘了 dp[j]%=mod 其中 在枚举所有因数的时候用到一个很巧妙的方法 用vector存储 (n*logn)的复杂...

月殇 339

Codeforces Round #523 (Div. 2) C. Multiplicity dp

题解 题目大意 给一个序列a问能组成多少个子序列b 要求a序列元素顺序不能改变 a[i]只能出现在他的因子的下标位置 先打表将范围内数字因子求出 时限3秒足够 定义一个数组d 表示长度为i的情况有多少个 按照顺序遍历整个数组a倒序遍历他的因子k 如果他有因k他可以放在k这个位置 则d[k] = d[k] + d[k - 1] 最后给d整个数组求和求出每个位置结尾的情况 AC代码 #include ...

CaprYang的博客 392

Codeforces Round #523 (Div. 2) C - Multiplicity (DP+预处理)

题目链接:http://codeforces.com/contest/1061/problem/C 题意:给你一个长度为n的序列a,从序列a中下选任意数字组成序列b,定义 任意 b【i】% i == 0 的 b序列为good序列。求有多少条的good序列 题解:很容易想到,先预处理出来每个a【i】能放的位置,即a【i】的约数。 定义dp【i】表示长度为 i 的b序列有多少种。 那么转移方程...

PK__PK的博客 299

Codeforces - Multiplicity (DP)

Codeforces - Multiplicity(DP) Codeforces Round #523 (Div. 2) - C 题目链接:https://codeforces.com/contest/1061/problem/C 思路: 一开始用的二维dp,dp[i][j]dp[i][j]dp[i][j]表示前iii个数长度为jjj的子序列的方法数,复杂度O(n2)O(n^2)O(n2),...

NaNa 342

Codeforces Round #523 (Div. 2) C. Multiplicity

C. Multiplicity 题目链接:https://codeforc.es/contest/1061/problem/C 题意: 给出一串数,问它的“好序列“有多少。好序列的定义是,首先是一个子序列(顺序可以打乱),其次,序列相应位置的数可以除尽该位置编号。 题解:这题是dp,我没有想到,主要是状态的定义。 定义dp(i,j):在a1,a2...ai中长度为j的好序...

dft539533的博客 163

Codeforces Round #523 (Div. 2) A B (暴力) C (欧拉函数变形+dp)

A. Coins 题目链接:https://codeforces.com/contest/1061/problem/A 题目大意:n种树,每种数可以不限量的取,问组成x最少需要多少个数 题解:直接判断能取最大的全取最大的,不能取最大的取一个补充的 int main() { std::ios::sync_with_stdio(false); int n,s; while(cin&gt...

永远鲜红の幼月的博客 456

Codeforces Round #523 (Div. 2)

  http://codeforces.com/contest/1061 哇,昨晚打的cf终于又上了一大波分,哇哈哈哈哈哈哈哈!!! 不过过程是真的有点难受,,最后30分钟已经放弃,想去hack的,然后发现没有找到hack点。。。 --------------------------------------------------------------------------------...

AAAAAAAC的博客 280

Codeforces Round #523 (Div. 2)C. Multiplicity

11点送命场没敢打,赛后补题,还是看了神仙代码才会的(弱~)。 dp,枚举每一个数,找出每一个数的因数,然后枚举相应的位置,状态方程为dp[j]+=dp[j-1](dp[k]记录的是已枚举完的数到k位置有多少组情况),空间优化一下所以要注意从大到小。 上代码~ #include&lt;bits/stdc++.h&gt; using namespace std; int dp[100000...

qq_41249179的博客 229
上一篇: POJ 2528 Mayor's posters 【离散化+线段树区间覆盖】
下一篇: HDU 4027 【线段树区间开根号】
Y390d
博客等级 码龄9年 11粉丝 165原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值