UVA10539

根据题意,可以很容易地发现,题目所要求的数都可以用形如 $ p^x$ 的式子表示(其中 $ p $ 为质数, \(x \ge 2\)),即分解成只含同一个质因子的式子。这提示我们使用构造的思想。

因为 \(n\) 最大为 $ 10 ^ {12}$,所以最大的 \(\sqrt n\) 也不会超过 \(10^6\)。考虑使用线性筛求出 \(10^6\) 以内的质数,再依次枚举每个质数 \(p\) 的幂:\(p^2\)\(p^3\),⋯\(p^k\),统计其中满足 \(L \le p^k \le U\) 的个数即可。

注意,当 \(p^k > U\) 时要结束循环。

代码如下:

#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
ll tot,a[10000001],b[10000001];
int main()
{
	for(int i=2;i<=1000000;i++)
	{
		if(a[i]==0) b[++tot]=i;
		for(int j=1;j<=tot&&i*b[j]<=1000000;j++)
		{
			a[i*b[j]]=1;
			if(i%b[j]==0)
				break;
		}
	}
	int T;
	cin>>T;
	while(T--)
	{
		ll l,r,ans=0;
		cin>>l>>r;
		for(ll i=1;i<=tot;i++)
			for(ll j=b[i]*b[i];j<=r;j*=b[i])
				if(j>=l)
					ans++;
		cout<<ans<<endl;
	}
	return 0;
}

\(tips\) :建议把所有变量都开long long,避免不必要的错误答案。

posted @ 2024-01-20 17:24  liyilang2021  阅读(1)  评论(0编辑  收藏  举报