HDU 5750

题意大概是给一个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;
}

猜你喜欢

转载自blog.csdn.net/qq_40433083/article/details/84778800
hdu