luogu 4411 [BJWC2010]取数游戏 约数+dp
作者:互联网
不大难的dp,暴力拆一下约数然后按照约数来统计即可.
注意:vector 很慢,所以一定特判一下,如果没有该数,就不要添加.
Code:
#include <bits/stdc++.h> #define N 1000005 #define setIO(s) freopen(s".in","r",stdin) using namespace std; vector<int>v[N]; int prime[N],f[N],g[N],A[N]; bool vis[N],go[N]; int main() { // setIO("input"); int n,L,i,j,tot=0,M=0; scanf("%d%d",&n,&L); for(i=1;i<=n;++i) scanf("%d",&A[i]), go[A[i]]=1; for(i=2;i<N;++i) { if(!vis[i]) prime[++tot]=i; for(j=1;j<=tot&&prime[j]*i<N;++j) { vis[i*prime[j]]=1; if(i%prime[j]==0) break; } } for(i=L;i<N;++i) for(j=i;j<N;j+=i) if(go[j])v[j].push_back(i); for(i=1;i<=n;++i) { int c=A[i],mx=0; for(j=0;j<v[c].size();++j) { int cur=v[c][j]; ++g[cur]; mx=max(mx, g[cur]); } for(j=0;j<v[c].size();++j) { int cur=v[c][j]; g[cur]=mx; } M=max(M,mx); } printf("%d\n",M); return 0; }
标签:约数,int,luogu,4411,setIO,tot,dp,define 来源: https://www.cnblogs.com/guangheli/p/11602046.html