我请问我写的不是跟你一样吗? @charlieqi
1 个赞
loglog1e7才4跟常数没区别
过来救我!!!
1 个赞
最后用欧拉筛的框架套DP即可!
1 个赞
不用筛,直接dp就行了
dp[i]代表i为最大值的时候能够构成的最大序列长度
不行,需要筛
这样有超时的风险,虽然能过
我直接dpac了
其实可以专门出数据卡掉的
显然,你这不是正解
替他回复一下,他被禁言了
你现在的代码长啥样,啥状态,重新发一下
谁被禁言了
#include <bits/stdc++.h>
#define s i*prime[j]
using namespace std;
map<int,int> mp;
map<int,int> vis;
int prime[10000001],dp[10000001];// dp[i]->当前选的是i的因数且可选,最多能选多少个数
int main(){
freopen("item.in","r",stdin);
freopen("item.out","w",stdout);
int n,pmaxn=0;
scanf("%d",&n);
for(int i=1,x;i<=n;i++){
scanf("%d",&x);
mp[x]++;
pmaxn=max(pmaxn,x);
}
int p=0;
vis[0]=1;
vis[1]=1;
int q=sqrt(n);
for(int i=2;i<=q;i++){
if(vis[i]==0){
for(int j=i+i;j<=n;j+=i){
vis[j]=1;
}
}
}
for(int i=1;i<=pmaxn;i++){
if(vis[i]==0){
prime[++p]=i;
}
}
for(int i=1;i<=pmaxn;i++){
dp[i]+=mp[i];
for(int j=1;s<=pmaxn&&j<=p;j++){
dp[s]=max(dp[s],dp[i]);
}
}
int maxn=0;
for(int i=1;i<=pmaxn;i++){
if(mp[i]!=0){
maxn=max(maxn,dp[i]);
}
}
printf("%d",maxn);
}
/*
6
1 4 2 8 5 7
1 2 3 2 2 4
1 2 4 5 7 8
*/
RE 30,换了埃拉托斯尼筛
埃氏筛时间复杂度太劣啦
不是你说让他用的吗?
我说他写的埃氏筛时间复杂度太劣啦,最优应该是ii<=q,j=ii
1 个赞
确实
唉,不是,markd什么东西?
1 个赞