VJ上的链接:https://cn.vjudge.net/problem/HDU-5750
题目大意:给定n和d,求1~(n-1)里面最大约数为d的数有多少个(d除外)
思路:因为d是最大约数,所以n=最小质因子*d,记minpf(n)是n的最小质因子,则我们取出的数一定要小于等于minpf(d),否则一定可以从d中分解出比取出来的数更小的因子
ps:c++用cin会超时。。。换成scanf,记得加上cstdio
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int tomax=40000;
long long np[tomax],prime[tomax];
int cont;
void initialize() //打素数表,保存在prime里
{
memset(np,0,sizeof(np));
cont=0;
for(long long i=2; i<tomax; i++)
if(np[i]==0)
{
prime[cont]=i;
cont++;
for(long long j=i*i; j<tomax; j+=i)
np[j]=1;
}
}
long long solve(long long n,long long d)
{
long long ans=0;
for(int i=0;i<cont;i++)
{
if(d*prime[i]>=n) break;
ans++;
if(d%prime[i]==0) break;
}
return ans;
}
int main()
{
int t;
long long n,d,ans;
initialize();
scanf("%d",&t);
for(int i=0;i<t;i++)
{
scanf("%lld %lld",&n,&d);
ans=solve(n,d);
cout<<ans<<endl;
}
return 0;
}