传送门

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)的更多相关文章

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

    C. Multiplicity 题目链接:https://codeforc.es/contest/1061/problem/C 题意: 给出一串数,问它的“好序列“有多少.好序列的定义是,首先是一个子 ...

  2. Codeforces Round #523 (Div. 2)C(DP,数学)

    #include<bits/stdc++.h>using namespace std;long long a[100007];long long dp[1000007];const int ...

  3. Codeforces Round #523 (Div. 2)

    Codeforces Round #523 (Div. 2) 题目一览表 来源 考察知识点 完成时间 A Coins cf 贪心(签到题) 2018.11.23 B Views Matter cf 思 ...

  4. Codeforces Round #131 (Div. 1) B. Numbers dp

    题目链接: http://codeforces.com/problemset/problem/213/B B. Numbers time limit per test 2 secondsmemory ...

  5. Codeforces Round #131 (Div. 2) B. Hometask dp

    题目链接: http://codeforces.com/problemset/problem/214/B Hometask time limit per test:2 secondsmemory li ...

  6. Codeforces Round #276 (Div. 1) D. Kindergarten dp

    D. Kindergarten Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/proble ...

  7. 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 ...

  8. Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS

    题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...

  9. Codeforces Round #539 (Div. 2) 异或 + dp

    https://codeforces.com/contest/1113/problem/C 题意 一个n个数字的数组a[],求有多少对l,r满足\(sum[l,mid]=sum[mid+1,r]\), ...

随机推荐

  1. Python:matplotlib绘制条形图

    条形图,也称柱状图,看起来像直方图,但完是两码事.条形图根据不同的x值,为每个x指定一个高度y,画一个一定宽度的条形:而直方图是对数据集进行区间划分,为每个区间画条形.     将上面的代码稍微修改一 ...

  2. eclipse中将Java项目转换为JavaWeb项目

    eclipse导入一些war项目后,会以java项目形式存在,因此我们需要将java项目转换成web项目,不然项目也许会报错. 1.右键已经导入的项目,选择properties. 2.选中projec ...

  3. Lodop打印如何隐藏table某一列

    Lodop打印超文本,既可以打印页面上存在的某些部分,也可以自己组织超文本和css样式传入,有些需要打印的页面表格里,会有一列有编辑删除等按钮,用于对于数据库数据的操作,在打印的时候,这一列由于不属于 ...

  4. Lodop打印控件指定打印任务某几页

    使用Lodop打印控件进行打印开发,有时候一个任务里有多页,例如各种合同之类的,客户端用户在使用过程中,可能有某一页打印后发现需要修改,这时候不必再把整个任务重新打印一遍,只需要打印需要修改的那页重新 ...

  5. Zero to Build: Create new Xamarin apps in minutes with AppMap

    Creating a new Xamarin.Forms app can be an intimidating task, especially if you add in content pages ...

  6. hdu1878-并查集,欧拉回路

    纯裸题..写着方便理解... 题意:判断一个无向图是否存在欧拉回路... 解题思路:并查集判断一下是否联通,然后再判断一下点的度数是否为偶数就行了: #include<iostream> ...

  7. 【NLP】Recurrent Neural Network and Language Models

    0. Overview What is language models? A time series prediction problem. It assigns a probility to a s ...

  8. BZOJ3724PA2014Final Krolestwo——欧拉回路+构造

    题目描述 你有一个无向连通图,边的总数为偶数.设图中有k个奇点(度数为奇数的点),你需要把它们配成k/2个点对(显然k被2整除).对于每个点对(u,v),你需要用一条长度为偶数(假设每条边长度为1)的 ...

  9. 【XSY2751】Mythological IV 线性插值

    题目描述 已知\(f(x)\)为\(k\)次多项式. 给你\(f(0),f(1),\ldots,f(k)\),求 \[ \sum_{i=1}^nf(i)q^i \] \(k\leq 500000,n\ ...

  10. SCOI 2015 Day1 简要题解

    「SCOI2015」小凸玩矩阵 题意 一个 \(N \times M\)( $ N \leq M $ )的矩阵 $ A $,要求小凸从其中选出 $ N $ 个数,其中任意两个数字不能在同一行或同一列, ...