C. Multiplicity(DP + 分解因数)

news2024/9/23 1:26:40

Problem - C - Codeforces

给定一个整数数组a1,a2,...,an。

如果可以从a中删除一些元素得到b,则称数组b为a的子序列。

当且仅当对于每个i(1≤i≤k),bi是i的倍数时,数组b1,b2,...,bk被称为好。

在模109+7下找到a中好的子序列的数量。

如果两个子序列的包含数字的索引集合不同,则认为它们是不同的。也就是说,在比较子序列时,元素的值不重要。特别地,数组a恰好有2n-1个不同的子序列(不包括空子序列)。

输入

第一行包含一个整数n(1≤n≤100000)- 数组a的长度。

接下来一行包含整数a1,a2,...,an(1≤ai≤106)。

输出

仅打印一个整数-在模109+7下取的好子序列数量。

Examples

input

Copy

2
1 2

output

Copy

3

input

Copy

5
2 2 1 22 14

output

Copy

13

 

在第一个例子中,所有三个非空可能的子序列都是好的:{1},{1,2},{2}。在第二个例子中,可能的好子序列为:{2},{2,2},{2,22},{2,14},{2},{2,22},{2,14},{1},{1,22},{1,14},{22},{22,14},{14}。

请注意,某些子序列会列在多次,因为它们在原始数组中出现多次。

题解:
首先分解因数,把每个数的所有因数,存到其vector数组v[i]中,接着dp即可,

dp[i][j]:前i个且第i个的长度为j的序列个数

dp[i][j]+=dp[i-1][j]; 前i个,且当前i为终点长度为j的序列
if(a[i]%j==0) dp[i][j]+=dp[i-1][j-1];

肯定还要接着进行优化,由于j并不是都满足,所以我们利用前面我们分解的因数可以优化(dp[j]代表长度为j的b数组有多少种答案)

dp[v[i][j]] = dp[v[i][j]] + dp[v[i][j] - 1]肯定由比当前因子少一的转移过来

为啥10000*sqrt(1e6)不会t,因为题中保证了,数组a恰好有2n-1个不同的子序列(不包括空子序列)

还要就是dp过程,类似01背包只能拿一次,所以从后往前DP

#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
#define int long long
typedef pair<int,int> PII;
int mod = 1e9 + 7;
vector<int> v[100050];
int dp[1000050];
void solve()
{
	int n;
	cin >> n;
	for(int i = 1;i <= n;i++)
	{
		int x;
		cin >> x;
		for(int j = 1;j*j <= x;j++)
		{
			if(x%j == 0)
			{
				if(j*j == x)
				{
					v[i].push_back(j);
				}
				else
				{
					v[i].push_back(j);
					v[i].push_back(x/j);
				}
			}
		}
		sort(v[i].begin(),v[i].end());
	}
	dp[0] = 1;
	for(int i = 1;i <= n;i++)
	{
		for(int j = v[i].size() - 1;j >= 0;j--)
		{
			dp[v[i][j]] = (dp[v[i][j]] + dp[v[i][j] - 1])%mod;
		}
	}
	int ans = 0;
	for(int i = 1;i <= 100000;i++)
	{
		ans = (ans + dp[i])%mod;
	} 
	cout << ans;
}
signed main()
{
//	ios::sync_with_stdio(0 );
//	cin.tie(0);cout.tie(0);
	int t = 1;
//	cin >> t;
	while(t--)
	{
		solve(); 
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/480038.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Data JPA 快速上手

一、JPA的概述 JPA的全称是Java Persisitence API&#xff0c;即JAVA持久化API&#xff0c;是sum公司退出的一套基于ORM的规范&#xff0c;内部是由一些列的接口和抽象类构成。JPA通过JDK5.0注解描述对象-关系表的映射关系&#xff0c;并将运行期的实体对象持久化到数据库中。…

Mysql 分库分表 Mycat

0 课程视频 https://www.bilibili.com/video/BV1Kr4y1i7ru?p163&spm_id_frompageDriver&vd_sourceff8b7f852278821525f11666b36f180a 1 单库问题 1.1 热点数据多 -> 缓冲区不足 ->内存不足 1.2 数据多 -> 磁盘不足 1.3 请求数据量多 -> 带宽不足 1…

C/C++的命名空间和调用函数的详细讲解

目录 空函数 调用函数 调用 执行流程 命名空间 在创建函数时&#xff0c;必须编写其定义。所有函数定义包括以下组成部分&#xff1a; 名称&#xff1a;每个函数都必须有一个名称。通常&#xff0c;适用于变量名称的规则同样也适用于函数名称。形参列表&#xff1a;调用函…

算法记录lday4 LinkedList链表交换 删除倒数N个点 环形链表

今日任务 ● 24. 两两交换链表中的节点 ● 19.删除链表的倒数第N个节点 ● 面试题 02.07. 链表相交 ● 142.环形链表II 两两交换链表中的节点 题目描述 Given a linked list, swap every two adjacent nodes and return its head. You must solve the problem without modi…

一天吃透Redis面试八股文

Redis连环40问&#xff0c;绝对够全&#xff01; Redis是什么&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一个使用 C 语言编写的&#xff0c;高性能非关系型的键值对数据库。与传统数据库不同的是&#xff0c;Redis 的数据是存在内存中的&#xf…

Golang每日一练(leetDay0052)

153. 寻找旋转排序数组中的最小值 Find Minimum In Rotated Sorted Array 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,2,4,5,6,7] 在变化后可能得到&#xff1a; …

纸模图纸的发展历程+纸模图纸免费下载-手工985

纸模图纸是一种用于制作模型的图纸&#xff0c;通常用于制作卡通纸模图纸、飞机纸模图纸、船只纸模图纸、汽车纸模图纸、建筑纸模图纸等模型。 纸模图纸的历史 纸模图纸的历史可以追溯到19世纪末期。当时&#xff0c;一些欧洲的制图师开始使用纸板和纸张来制作建筑模型&#xf…

【MATLAB数据处理实用案例详解(21)】——利用SOM自组织映射网络实现癌症样本数据分类和利用SOM自组织映射网络实现柴油机故障分类详解

目录 一、SOM原理分析二、SOM拓扑结构分析三、三种SOM拓扑结构3.1 Gridtop()网格拓扑结构3.2 Hextop()六角形拓扑结构3.3 Randtop()随机拓扑结构 四、利用SOM自组织映射网络实现癌症样本数据分类4.1 问题描述4.2 输入数据4.3 网络建立和训练4.4 验证4.5 预测4.6 运行结果 五、利…

wait/waitpid(重点)介绍

谢谢你的阅读&#xff0c;如有错误请大佬留言 目录 引子&#xff1a; waitpid 返回值介绍 参数介绍 pid status options: 引子&#xff1a; 当一个进程创建子进程后&#xff0c;如果子进程工作结束后会进入僵尸状态&#xff0c;等待父进程回收子进程资源&#xff08;退…

烟花智能直播助手,直播带货必备爆单工具【直播助手脚本+技术教程】

烟花智能直播助手软件教程介绍&#xff1a; 1.账号管理:可以登陆多个账号,一键切换 2.商品批量管理&#xff1a;可一键删除/添加直播商品,一键设置商品卖点 3.自动弹讲解:可设置指定,单个,列表循环自动弹商品讲解 4.智能文字客服:可设置指定关键词对公屏信息进行回复,不限添加条…

【C语言】C语言总结

声明&#xff0c;本文来自中国mooc中的翁凯C语言总结 第一章介绍 变量定义 变量定义的一般形式为&#xff1a;<类型名称><变量名称>变量需要一个名字&#xff0c;变量的名字是一种表示符&#xff0c;意思是用来识别不同的标识符标识符的基本构造规则为&#xff…

近世代数 笔记与题型连载 第十一章(正规子群与商群)

文章目录 基本概念1.正规子群2.商群 常见题型1.正规子群的判定和证明2.给定群和正规子群&#xff0c;求商群 基本概念 1.正规子群 正规子群的定义&#xff1a;设<G,※>是群&#xff0c;H是G的子群。如果对于G中的任意元素g&#xff0c;都有gHHg&#xff0c;则称H是G的正…

org.apache.poi 设置 Excel 单元格颜色 RGB

一、背景说明 在使用 org.apache.poi 导出 Excel 时&#xff0c;需要设置部分单元格的颜色。 可以使用方法&#xff1a;org.apache.poi.ss.usermodel.CellStyle.setFillForegroundColor() 和 org.apache.poi.ss.usermodel.CellStyle.setFillPattern() 来设置单元格的颜色和填…

代码随想录 LeetCode数组篇 二分查找

文章目录 &#xff08;简单&#xff09;35. 搜索插入位置&#xff08;*中等&#xff09;34. 在排序数组中查找元素的第一个和最后一个位置&#xff08;简单&#xff0c;常见面试题&#xff09;69. x的平方根&#xff08;简单&#xff09; 367. 有效的完全平方数 # &#xff08;…

三款自研AI应用引领未来,重塑行业新风尚

在这个科技日新月异的时代&#xff0c;AI技术已经渗透到我们生活的方方面面。今天&#xff0c;我们将向您推荐三款领域独具特色的AI应用&#xff0c;它们分别是AI律师、AI小红书文案提示词、以及AI Midjourney提示词。这些应用都具有独特的内涵&#xff0c;让我们一起走进这些智…

linux--进程程序替换

目录 一、什么是进程程序替换 二、原理&#xff1a; 三、为什么要进行程序替换 四、六种替换函数 命名理解 (1)函数execl (2)函数execv (3)execlp (4)execvp (5)execle (6)execve 一、什么是进程程序替换 所谓进程程序替换&#xff0c;顾名思义&#xff0c;就是使用一个…

‘cnpm‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

文章目录 1.0 问题描述2.0 检查环境&#xff1a;2.0.1查看node 环境2.0.2 cnpm 要安装好 3.0 查看原因4.0 问题解决【配置环境变量】4.0.1 方式一4.0.2 方式二 5.0 测试成功 1.0 问题描述 ‘cnpm’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 2.0 检…

手动开发--简单的 Spring 基于注解配置的程序

目录 手动开发--简单的 Spring 基于注解配置的程序 需求说明 思路分析程序结构 2) 程序框架图 ● 应用实例 创建ComponentScan.java注解 创建WyxSpringConfig 创建WyxSpringApplicationContext 作用 注意 获取全类名的步骤 Class.forName和Class.loadClass的区别 手…

c++ 11标准模板(STL) std::vector (二)

定义于头文件 <vector> template< class T, class Allocator std::allocator<T> > class vector;(1)namespace pmr { template <class T> using vector std::vector<T, std::pmr::polymorphic_allocator<T>>; }(2)(C17…

马上五一了,带大家玩一下五子棋——C语言

五一祝福 因为这篇博文实在五一这天完成的&#xff0c;所以呢&#xff0c;在介绍五子棋之前&#xff0c;先祝各位支持小白的大佬都五一快乐&#xff01; 花了点时间下了个“五一快乐”的五子棋&#xff0c;哈哈哈哈哈哈&#xff0c;还不太熟练&#xff0c;所以写的有点丑&…