Friday 16 October 2015

B. Good Sequences
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Squirrel Liss is interested in sequences. She also has preferences of integers. She thinks n integers a1, a2, ..., an are good.
Now she is interested in good sequences. A sequence x1, x2, ..., xk is called good if it satisfies the following three conditions:
  • The sequence is strictly increasing, i.e. xi < xi + 1 for each i (1 ≤ i ≤ k - 1).
  • No two adjacent elements are coprime, i.e. gcd(xi, xi + 1) > 1 for each i (1 ≤ i ≤ k - 1) (where gcd(p, q) denotes the greatest common divisor of the integers p and q).
  • All elements of the sequence are good integers.
Find the length of the longest good sequence.
Input
The input consists of two lines. The first line contains a single integer n (1 ≤ n ≤ 105) — the number of good integers. The second line contains a single-space separated list of good integers a1, a2, ..., an in strictly increasing order (1 ≤ ai ≤ 105ai < ai + 1).
Output
Print a single integer — the length of the longest good sequence.
Sample test(s)
input
5
2 3 4 6 9
output
4
input
9
1 2 3 5 6 7 8 9 10
output
4
Note
In the first example, the following sequences are examples of good sequences: [2; 4; 6; 9], [2; 4; 6], [3; 9], [6]. The length of the longest good sequence is 4.



The code is self explanatory

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int arr[100010];
int dp[100010];
int last[100110];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
 cin>>arr[i];
}
for(int i=1;i<=100010;i++)
last[i]=-1;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
dp[i]=1;
   int val=arr[i];
   int range=sqrt(val);
 //  cout<<"her for i="<<" "<<i<<endl;
   int j;
for( j=2;j<=range;j++)
   {
    bool f=0;
   
      while(val%j==0 && val!=0)
      {
           f=1;
val=val/j;
 
  }
  if(f)
  {
//   cout<<"inisde "<<endl;
      if(last[j]!=-1)
      {
//  cout<<"last  "<<last[j]<<endl;
        dp[i]=max(dp[i],1+dp[last[j]]);
       }
//        cout<<"setting last of "<<j <<" as "<<i<<endl;
last[j]=i;  
  }
}
// cout<<"setting last of cal as "<<val<<" "<<i<<endl;
if(val>1)
dp[i]=max(dp[i],1+dp[last[val]]);
last[val]=i;
        }
        int ans=0;
        for(int i=1;i<=n;i++)
        { 
 ans=max(ans,dp[i]);
//  cout<<dp[i]<<" "<<endl;
}
cout<<ans<<endl;
return 0;
}

No comments:

Post a Comment