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 ≤ 105; ai < 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