UVA - 11752 数论

解题思路:任意的一个次方数(既可以表示为p^k的数,k,p>1整数,)都可以化成底数是一个非次方数,则指数做出相应改变即可。那么一个数是否是Super Power Numbers就看他是不是一个次方数,让他的底数变成非次方数,然后看其相应指数是非质数就可以了。因为最小非质数(除了1)就是4了,那么p的取值其他最大就是1e5就够了,我们可以通过找出1e5之内的质数,然后再根据要求求得Super Power Numbers就可以了。


#include<bits/stdc++.h>
#include<time.h> 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int mx = 1e5+10;
const ull INF = pow(2,64) - 1;
int n,pri[mx],tot;
bool vis[mx],vic[mx];
void init()
{
	for(int i=2;i<mx;i++){
		if(!vic[i]) pri[tot++] = i;
		for(int j=0;j<tot&&pri[j]*i<mx;j++)
		{
			vic[i*pri[j]] = 1;
			if(i%pri[j]==0) break;
		}
	}
}
ull num[mx];
int main()
{
	init();
	int top = 0;
	for(int i=2;i<mx;i++){
		if(vis[i]) continue;//不考虑次方数做底数 
		int j = 2;
		ull val = 1ll*i;
		while(val<=INF/i){
			val *= i;
			if(val<mx) vis[val] = 1;//底数是次方数的筛掉 
			if(vic[j++]) num[top++] = val;
		}
	}
	puts("1"),sort(num,num+top);
	for(int i=0;i<top;i++) 
	printf("%llu\n",num[i]); 
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值