CF264B Good Sequences

Posted forward777

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF264B Good Sequences相关的知识,希望对你有一定的参考价值。

  传送门

Description:

松鼠丽丝特别喜欢n个她称之为“好整数”的整数:a1,a2,……,an。(会输入)

现在,她对“好序列”很感兴趣。如果一个序列x1,x2,...,xk能够满足一下三个条件,那就是一个“好序列”:

1.该序列是严格上升的,即x[i] < x[i+1](1<=i<=k-1)

2.任意两个相邻的元素是非互质的,即gcd(x[i],x[i+1]) > 1 (1<=i<=k-1) (gcd即最大公约数)

3.所有的数字都是“好整数”

现在,请你找出长度最长的“好序列”

 

暴力DP解法:(当然不是AC做法)

  就是很像导弹拦截

  dp[i]表示以编号为i的好数结尾的最长好序列

  枚举判断转移就OK啦

 

技术图片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #define R register
 5 #define go(i,a,b) for(R int i=a;i<=b;i++)
 6 #define ll long long
 7 #define M 100000
 8 using namespace std;
 9 int read()
10 {
11     int x=0,y=1;char c=getchar();
12     while(c<0||c>9) {if(c==-) y=-1;c=getchar();}
13     while(c>=0&&c<=9) {x=(x<<1)+(x<<3)+c-0;c=getchar();}
14     return x*y;
15 }
16 int n,a[M],dp[M],ans;
17 int gcd(int x,int y)
18 {
19     return x%y==0?y:gcd(y,x%y);
20 }
21 int main()
22 {
23     n=read();
24     go(i,1,n) a[i]=read(),dp[i]=1;
25     sort(a+1,a+n+1);
26     go(i,1,n) 
27     {
28         go(j,1,i-1) if(gcd(a[i],a[j])>1) dp[i]=max(dp[i],dp[j]+1);
29         ans=max(ans,dp[i]);
30     }
31     printf("%d",ans);
32 }
暴力DP Code

 

正解:

  之前的n2转移是枚举判断两个数是否互质

  如果两个数之间不互质其实就是有除了1以外的公因数

  我们发现a[i]是小于等于105

  所以可以记录b[i]为以i为因数的好数结尾的好序列的最大长度

  具体见代码 很好懂的啦

 

CODE:

技术图片
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #define R register
 6 #define go(i,a,b) for(R int i=a;i<=b;i++)
 7 #define ll long long
 8 #define M 100000+10
 9 using namespace std;
10 int read()
11 {
12     int x=0,y=1;char c=getchar();
13     while(c<0||c>9) {if(c==-) y=-1;c=getchar();}
14     while(c>=0&&c<=9) {x=(x<<1)+(x<<3)+c-0;c=getchar();}
15     return x*y;
16 }
17 int n,a[M],b[M],dp[M],ans;
18 int main()
19 {
20     n=read();
21     go(i,1,n) a[i]=read(),dp[i]=1;
22     sort(a+1,a+n+1);
23     go(i,1,n) 
24     {
25         int x=a[i],maxn=sqrt(a[i])+1;
26         go(j,2,maxn) 
27         {
28             if(x%j==0) dp[i]=max(dp[i],b[j]+1);
29             while(x%j==0) x/=j;
30         }
31         if(x>1) dp[i]=max(dp[i],b[x]+1);
32         x=a[i];
33         go(j,2,maxn) 
34         {
35             if(x%j==0) b[j]=dp[i];
36             while(x%j==0) x/=j;
37         }
38         if(x>1) b[x]=dp[i];
39         ans=max(ans,dp[i]);
40     }
41     printf("%d",ans);
42 }
View Code

 


以上是关于CF264B Good Sequences的主要内容,如果未能解决你的问题,请参考以下文章

CF264B Good Sequences

[CF1030E]Vasya and Good Sequences

CF1030E Vasya and Good Sequences 最大值分治/容斥

Codeforces 1053 B - Vasya and Good Sequences

codeforces 1041 E.Vasya and Good Sequences(暴力?)

[Codeforces#264B] Good Sequences