题意:给你一个严格递增的数列,问你从中选出数使得每个数与前一个数不互质且长度最长的数列长度为多少
解题思路:
用质因子筛法 http://www.cnblogs.com/zyue/p/3716938.html
求这个质因子最迟在哪里出现过假设是K,dp[i] = max(dp[i],dp[k]+1);
解题代码:
1 // File Name: 264b.cpp 2 // Author: darkdream 3 // Created Time: 2014年07月26日 星期六 14时55分43秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 25 using namespace std; 26 int prime[100005][20]; 27 int hs[100005]; 28 int num[100005]; 29 int k = 0 ; 30 void solve(){ 31 memset(num,0,sizeof(num)); 32 memset(hs,0,sizeof(hs)); 33 for(int i = 2 ;i <= 100000;i ++) 34 { 35 if(hs[i] == 0 ) 36 { 37 int k = i; 38 while(k <= 100000) 39 { 40 num[k] ++ ; 41 prime[k][num[k]] = i ; 42 hs[k] = 1; 43 k += i ; 44 } 45 } 46 47 } 48 } 49 int dp[100005]; 50 int main(){ 51 int n ; 52 scanf("%d",&n); 53 for(int i = 1;i <= n;i ++) 54 dp[i] = 1; 55 solve(); 56 int maxn = 1; 57 memset(hs,0,sizeof(hs)); 58 for(int i =1 ;i<= n;i ++) 59 { 60 int temp ; 61 scanf("%d",&temp); 62 int p = 1; 63 for(int j =1 ; j <= num[temp];j ++) 64 { 65 if(hs[prime[temp][j]]) 66 { 67 dp[i] = max(dp[i],dp[hs[prime[temp][j]]] + 1); 68 } 69 hs[prime[temp][j]] = i ; 70 } 71 maxn = max(maxn,dp[i]); 72 } 73 printf("%d ",maxn); 74 return 0; 75 }