Codeforces Round #523 (Div. 2) C Multiplicity (DP)
https://www.cnblogs.com/violet-acmer/p/10005351.html
题意:
给定一数组a[],从a[ ]中除去任意个元素得到b[ ],求能形成多少“好序列”;
好序列的定义是:对于任意的 i 有 b[i]%i == 0(1 ≤ i ≤ size_b[ ])。
题解:
相关变量解释:
int n;
int a[maxn];
int dp[maxn];//dp[i] : 下标i处可以获得的最大的"好序列"
int factor[maxn];//factor[i] : 记录a[i]的因子
步骤:
(1):从a[1]开始遍历整个数组;
(2):来到a[i]处,将a[i]因式分解,找到其所有的因子factor,并判断其是否在[1,i ]范围内,如果在dp[factor] += dp[factor-1];(对于所有的factor)
具体看代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
const int MOD=1e9+;
const int maxn=1e5+; int n;
int a[maxn];
int dp[maxn];//dp[i] : 下标i处可以获得的最大的"好序列"
int factor[maxn];//factor[i] : 记录a[i]的因子 void updataDp(int i)
{
int index=;
for(int j=;j*j <= a[i];++j)
{
if(a[i]%j == )//判断j是否为a[i]的因子
{
factor[index++]=j;//记录a[i]的因子
if(a[i]/j != j && a[i]/j <= i)//判断其另一个因子a[i]/j是否 <= i,并判断其是否等于 j
factor[index++]=a[i]/j;
}
}
sort(factor+,factor+index);
for(int j=index-;j >= ;--j)//从大因子到小因子,防止a[i]的小因子影响大因子
{
int x=factor[j];
dp[x] += dp[x-];
dp[x] %= MOD;
}
}
int Solve()
{
mem(dp,);
dp[]=;
for(int i=;i <= n;++i)//遍历a[]
updataDp(i);//由a[i]更新dp[] int res=;
for(int i=;i <= n;++i)
res=res%MOD+dp[i]; return res%MOD;
}
int main()
{
scanf("%d",&n);
for(int i=;i <= n;++i)
scanf("%d",a+i);
printf("%d\n",Solve());
}
AC前的错误代码分析:
void updataDp(int i)
{
for(int j=;j < i;++j)
if(a[i]%(j+) == )
dp[j+] += dp[j],dp[j+] %= MOD;
dp[]++;
}
①:从小因子到大因子更新dp[ ],在第五组数据就wa了
根据dp定义,dp[ i ]指的是当前元素a[i]在去点其之前的若干个元素后可以形成的“好序列”个数,终点是“其之前”,如果从小因子到大因子更新dp[ ],
dp[bigFactor] += dp[bigFactor-1];如果bigFactor-1是a[i]的因子,那么这个因子就会给dp[bigFactor]做贡献,而实际是不需要。
②:查找a[i]的因子是从1遍历到i,在第八组数据TLE
此算法的时间复杂度为O(N^2),当然会TLE了,然后,实在是没辙了,就去翻了翻大佬博客,发现这篇博客上使用vector存储的a[i]的所有因子,在
查找a[ i ]的所有因子时的时间复杂度是sqrt(n),当我看到sort排序的时候有点纳闷,加个O(nlogn)的排序难道不超时?
后来仔细想了一下,a[ i ]的所有因子很少(106才49个因子),所以用sort顶多是O(1)的时间复杂度,而整体时间复杂度为O(n√n),当然就轻轻松松的A掉了......
Codeforces Round #523 (Div. 2) C Multiplicity (DP)的更多相关文章
- Codeforces Round #523 (Div. 2) C. Multiplicity
C. Multiplicity 题目链接:https://codeforc.es/contest/1061/problem/C 题意: 给出一串数,问它的“好序列“有多少.好序列的定义是,首先是一个子 ...
- Codeforces Round #523 (Div. 2)C(DP,数学)
#include<bits/stdc++.h>using namespace std;long long a[100007];long long dp[1000007];const int ...
- Codeforces Round #523 (Div. 2)
Codeforces Round #523 (Div. 2) 题目一览表 来源 考察知识点 完成时间 A Coins cf 贪心(签到题) 2018.11.23 B Views Matter cf 思 ...
- Codeforces Round #131 (Div. 1) B. Numbers dp
题目链接: http://codeforces.com/problemset/problem/213/B B. Numbers time limit per test 2 secondsmemory ...
- Codeforces Round #131 (Div. 2) B. Hometask dp
题目链接: http://codeforces.com/problemset/problem/214/B Hometask time limit per test:2 secondsmemory li ...
- Codeforces Round #276 (Div. 1) D. Kindergarten dp
D. Kindergarten Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/proble ...
- Codeforces Round #260 (Div. 1) A - Boredom DP
A. Boredom Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/455/problem/A ...
- Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS
题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...
- Codeforces Round #539 (Div. 2) 异或 + dp
https://codeforces.com/contest/1113/problem/C 题意 一个n个数字的数组a[],求有多少对l,r满足\(sum[l,mid]=sum[mid+1,r]\), ...
随机推荐
- Java多线程3:Thread中的实例方法
一.Thread类中的方法调用方式 学习Thread类中的方法是学习多线程的第一步.在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别: ...
- [转]Java 的强引用、弱引用、软引用、虚引用
1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object(); // 强引用 当内存空间 ...
- codeforces285B
Find Marble CodeForces - 285B Petya and Vasya are playing a game. Petya's got n non-transparent glas ...
- hdu-2222(ac自动机模板)
题意:给你一个长度为n的单词表,一个文本串,问你这个文本串中出现了单词表中多少个单词: 解题思路:ac自动机的模板题,可以直接当模板用: 代码: #include<iostream> #i ...
- 三星Galaxy S10可望率先应用于1TB的手机内存
导读 三星电子(Samsung Electronics)1月30日宣布,已经开始量产业界首款容量高达1TB的嵌入式通用闪存存储器(embedded Universal Flash Storage,eU ...
- 【Python】Python-Numpy教程
Numpy的使用 读txt数据: · genfromtxt import numpy as np print(help(np.genfromtxt)) #data = np.genfromtxt(&q ...
- Civil 3D 二次开发 事务
事务,一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit). 对于初学者来说,从字面上难以理解什么是事务.下面我试着通过讲述事务的作用及特性来帮 ...
- POJ 2112-Optimal Milking-二分答案+二分图匹配
此题有多种做法. 使用floyd算法预处理最短路,二分答案,对于每一个mid,如果距离比mid小就连边, 注意把每个机器分成m个点.这样跑一个最大匹配,如果都匹配上就可以减小mid值. 用的算法比较多 ...
- codeforces1093G Multidimensional Queries 【线段树】
题目分析: 搜索2^k种情况,线段树分别处理就行了,正确性明显. 代码: #include<bits/stdc++.h> using namespace std; ; int n,k; ] ...
- 【XSY2469】graph 分治 并查集
题目大意 给你一张\(n\)个点\(m\)条边的无向图,问删去每个点后,原图是不是二分图. \(n,m\leq 100000\) 题解 一个图是二分图\(\Longleftrightarrow\)该图 ...