您的位置:首页 > 其它

BZOJ1978: [BeiJing2010]取数游戏 game

2014-09-17 19:00 357 查看

1978: [BeiJing2010]取数游戏 game

Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 650 Solved: 400
[Submit][Status]

Description

小 C 刚学了辗转相除法,正不亦乐乎,这小 P 又出来捣乱,给小 C 留了个
难题。
给 N 个数,用 a1,a2…an来表示。现在小 P 让小 C 依次取数,第一个数可以
随意取。假使目前取得 aj,下一个数取ak(k>j),则ak必须满足gcd(aj,ak)≥L。
到底要取多少个数呢?自然是越多越好!
不用多说,这不仅是给小 C 的难题,也是给你的难题。

Input

第一行包含两个数N 和 L。
接下来一行,有 N 个数用空格隔开,依次是 a1,a2…an。

Output

仅包含一行一个数,表示按上述取法,最多可以取的数的个数。

Sample Input

5 6

7 16 9 24 6

Sample Output

3

HINT

选取 3个数16、24、6。gcd(16,24)=8,gcd(24,6)=6。

2≤L≤ai≤1 000 000;

30% 的数据N≤1000;

100% 的数据 N≤50 000

Source

题解:

这种DP根本想不到啊。。。是数论的一般方法还没掌握吗。。。

类似最长上升子序列的做法,只不过有个要求就是gcd必须要>=l,这样根号n枚举因数,然后dp

dp[i]表示以i作为最大公因数可以选的数的最多个数

满足gcd>=l才更新dp

还是不理解?为什么可以把最大值加到每一个因数上啊?

唉?好像忽然明白了?

i代表若 x 与最后一个选的数gcd==i,此前最多可选多少数,只要要求最后一个选取的数有i因子即可,所以 x 可以更新到 所有 x 的因子。

终于想通了,好开心!

代码:

#include<cstdio>

#include<cstdlib>

#include<cmath>

#include<cstring>

#include<algorithm>

#include<iostream>

#include<vector>

#include<map>

#include<set>

#include<queue>

#include<string>

#define inf 1000000000

#define maxn 500+100

#define maxm 1000000+100

#define eps 1e-10

#define ll long long

#define pa pair<int,int>

#define for0(i,n) for(int i=0;i<=(n);i++)

#define for1(i,n) for(int i=1;i<=(n);i++)

#define for2(i,x,y) for(int i=(x);i<=(y);i++)

#define for3(i,x,y) for(int i=(x);i>=(y);i--)

#define mod 1000000007

using namespace std;

inline int read()

{

int x=0,f=1;char ch=getchar();

while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}

while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}

return x*f;

}
int n,m,ans,dp[maxm];

int main()

{

freopen("input2.txt","r",stdin);

freopen("output3.txt","w",stdout);

n=read();m=read();
for1(i,n)
{
int x=read(),y=0;
for1(j,int(sqrt(x)))
if(x%j==0)
{
y=max(y,dp[j]);
y=max(y,dp[x/j]);
}
y++;
for1(j,int(sqrt(x)))
if(x%j==0)
{
if(j>=m)dp[j]=y;
if(x/j>=m)dp[x/j]=y;
}
}
for2(i,m,maxm-1)ans=max(ans,dp[i]);
printf("%d\n",ans);

return 0;

}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: