您的位置:首页 > 其它

hdu_5750_Dertouzos(线性筛)

2016-07-24 00:41 148 查看

题目连接:hdu_5750_Dertouzos

题意:

给你一个n,一个d,问你比n小的数中有多少个数的最大的因子为d,比如6有因子1 2 3 最大的为3

题解:

当时比赛做这题的时候没考虑常数的优化,过了初测,然后FST了,卧槽。。。

这题仔细观察就可以发现我们只需要找一个数s,s*d比n小,且s不大于d的最小的质因数,这样才能使s*d这个数的最大的因子为d。然后我们就用线性筛 先筛出2W的素数,其实应该筛到33333的,不过我测试了数据2W也能过,然后就扫一遍就行了

#include<cstdio>
#define F(i,a,b) for(int i=a;i<=b;++i)

int primes[30000],tot=0,N=20000;
bool vis[20001];
void Euler(){
F(i,2,N){
if(!vis[i])primes[++tot]=i;
F(j,1,tot){
if(i*primes[j]>N)break;
vis[i*primes[j]]=1;
if(i%primes[j]==0)break;
}
}
}
int main(){
Euler();
int t,n,d;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&d);
int mi=-1,tp=(n-1)/d,ans=0;
for(int i=1;i<tot;i++)
{
if(primes[i]>tp)break;
ans++;
if(d%primes[i]==0)break;//如果d是当前素数的倍数,那么下一个素数肯定比这个素数大,所以直接退出
}
printf("%d\n",ans);
}
return 0;
}
View Code

 

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