SSLOJ 1458.HR 的疑惑

...

  • 题意:
  • 分析:
  • 代码:


题意:

求在 n n n以内的数中,有多少个数可以表示成 a b a^b ab的形式


分析:

首先我们先以 2 2 2为指数,那么在 n n n的范围内,就会有 n \sqrt n n 个数
再往大的指数看,如果是 3 3 3,那么底数最大也只能到 1 e 6 1e6 1e6,所以我们可以暴力枚举指数,再嵌套枚举每个底数
需要注意的是,我们这样会统计到重复的答案,所以就需要保证指数和底数都是素数,素筛可以边统计答案边做


代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long 
using namespace std;
inline LL read() {
    LL d=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
    return d*f;
}
LL v[70],tf[1000005];
int main()
{
	LL n=read();
	LL ans=sqrt(n);
	for(LL i=1;i*i<=1e6;i++) tf[i*i]=1;
	for(LL i=2;i<64;i++)
	{
		if(v[i]) continue;
		for(LL j=i;j<64;j+=i) v[j]=1;
		if(i==2) continue;
		for(LL j=1;pow(j,i)<=n;j++) ans+=(tf[j]?0:1);
		LL z;
		for(LL j=1;(z=pow(j,i))<=n;j++) if(z<=1e6) tf[z]=1; else break;
	}
	cout<<ans;
	return 0;
}

你可能感兴趣的:(数学,SSLOJ,数学)