题意大概是给一个n和d,问都多少小于n的数的最大因子d。一开始一直t,没有想到素数筛,其实只要先打表找出所有素数,然后直接暴力就行了。一个数d*x的最大因子为d,则x必为素数,否则可以再分即 x=x1*x2, x1*x2*d那就存在大于d的因子了,并且要满足x要小于d的最大素因子。
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#define maxn 100010
using namespace std;
int prime[maxn];
int vis[maxn];
int fun()
{
memset(vis, 0, sizeof(vis));
int count = 0;
for(int i=2; i<=maxn; i++)
{
if(vis[i] == 0)
prime[count++] = i;
for(int j=0; j<count&&i*prime[j]<=maxn; j++)
{
vis[i*prime[j]] = 1;
if(i%prime[j] == 0)
break;
}
}
return count;
}
int main()
{
int t;
while(~scanf("%d", &t))
{
int p = fun();
while(t--)
{
int ans = 0;
int n, d;
scanf("%d%d", &n, &d);
while(prime[ans] <= (n - 1) / d)
{
ans ++;
if(d % prime[ans - 1] == 0) break;
}
printf("%d\n", ans);
}
}
return 0;
}