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

RSA 2048/4096 签名校验算法 RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。 RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。 今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能... 阅读详情

题目链接: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;
}

 

动手在 SAP BTP Cloud Foundry 开发和部署 SAP UI5 应用的前置条件 - 订阅 SAP Build Work Zone Standard Version 摘要:本文介绍了SAP BTP Cloud Foundry环境中HTML5应用的概念,区分了web应用、HTML5应用和SAP UI5应用的关系。重点说明了在Cloud Foundry环境部署HTML5应用的方法是通过订阅SAP Build Work Zone standard edition服务,并详细描述了订阅过程中可能遇到的"OIDC trust missing"错误。该错误是由于业务用户认证需要配置SAP Cloud Identity Services的OpenID Connec 阅读详情

相关推荐

GEE入门之路(从【初学者】角度,大白话)——附海面风速插值代码

非常初级的GEE入门教程!大白话!有手就行!附海面风速插值代码,克里金插值,时间插值。

weixin_46812066的博客 4086

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

随机森林模型及案例(Python)

1 集成模型简介 集成学习模型使用一系列弱学习器(也称为基础模型或基模型)进行学习,并将各个弱学习器的结果进行整合,从而获得比单个学习器更好的学习效果。 集成学习模型的常见算法有Bagging算法和Boosting算法两种。 Bagging算法的典型机器学习模型为随机森林模型,而Boosting算法的典型机器学习模型则为AdaBoost、GBDT、XGBoost和LightGBM模型。 1.1 Bagging算法简介 Bagging算法的原理类似投票,每个弱学习器都有一票,最终根据所有弱学习器的投

qq_42433311的博客 4万+

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

ARM SMMUv3设备树配置实战:从零开始为RK3588搭建IOMMU环境

本文详细介绍了在RK3588平台上配置ARM SMMUv3设备树的实战经验。从理解硬件架构、设备树节点定义,到内核驱动集成与调试,提供了完整的IOMMU环境搭建指南,并分享了解决StreamID冲突、中断配置等常见问题的技巧,帮助开发者高效完成控制器初始化。

l3m4n的博客 884

保姆级教程:在阿里云ECS上用Docker一键部署EMQX MQTT服务器(Ubuntu 20.04)

本文提供在阿里云ECS上使用Docker一键部署EMQX MQTT服务器的详细教程,涵盖从实例创建、Docker环境配置到EMQX部署与优化的全流程。适合物联网开发者快速搭建高效、安全的MQTT消息服务器,适用于智能家居、工业物联网等场景。

weixin_28739079的博客 308

[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

【YOLOv8全方位学习手册】第四章 数据增强:从扩充数据到塑造模型的认知边界

"""使用 Albumentations 做自定义增强,兼容 YOLO 格式"""])# 转成 numpy# boxes 必须是 [[x_min,y_min,x_max,y_max], ...]# 在数据加载时调用你可以把集成到 PyTorch 的 Dataset 类里,或使用 Ultralytics 自带的DataLoader。

VectorShift的博客 211

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

RK3588平台开发系列讲解(USB篇)UAC初识

📢本篇将介绍RK3588平台`UAC`的配置使用。

内核笔记 3881

ABAP 7.40 新语法介绍系列之二 - ABAP 类型转换操作符 CONV

这个lv_input_s变量的唯一使命,就是接收来自 char10 类型的 lv_input_c 变量的值,然后传递到 print 方法里去。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1419

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

7.1华为OD机试真题 新系统 - 仓库盘点 (Java/Py/C/C++/Js/Go)

7.1华为OD机试真题 新系统 - 仓库盘点 (Java/Py/C/C++/Js/Go)

算法大师! 507

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【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

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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、付费专栏及课程。

余额充值