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