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啦
暴力DP Code1 #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 }
正解:
之前的n2转移是枚举判断两个数是否互质
如果两个数之间不互质其实就是有除了1以外的公因数
我们发现a[i]是小于等于105的
所以可以记录b[i]为以i为因数的好数结尾的好序列的最大长度
具体见代码 很好懂的啦
CODE:
View Code1 #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 }
以上是关于CF264B Good Sequences的主要内容,如果未能解决你的问题,请参考以下文章
[CF1030E]Vasya and Good Sequences
CF1030E Vasya and Good Sequences 最大值分治/容斥
Codeforces 1053 B - Vasya and Good Sequences