UVa 11752 The Super Powers(数学)

设一个数为x=a^k,如果k是合数,k=m*n,那么x=(a^m)^n=(a^n)^m,这样这个数就是超级幂了。

首先1是答案,然后底数从2开始循环,指数最多是64,所以先扫一遍64以下的合数。底数的范围是65536,因为2以上的合数最小是4,65536^4已经超过最大值了。这样一个二重循环,把2到65536的每个数的合数次幂都加到答案里。

显然这些答案是有重复的,去重两种方法:

1.头文件<algorithm>中的unique函数

用法:1.先排序 2.unique(容器·起始地址,结束地址)..

这个函数必须作用于有序的序列,重复的元素并不删除,而是放到有序序列的后面。函数返回的是有序序列末地址的下一个位置。

和sort一样可以引入自定的比较函数,写法:

bool myfunction (int i, int j) {
  return (i==j);
}


2.使用stl中的set:

set是自带去重和排序的,所以直接往里面insert就行了。遍历set要用迭代器,定义方法:set <数据类型>:: iterator p;

set也可以重载比较规则,但是规则要写成类的形式。如:

struct   link_struct 

        int   link_id; 
        int   link_cost; 
        …… 

class   link_compare 

        public: 
        bool   link_compare::operator()   (cost   link_struct*   first_link,   cost   link_struct*   second_link) 
        { 
                return(first_link-> link_id   <   second_link-> link_id); 
        } 

std::set <link_struct*   ,   link_compare>   set_link; 




#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#include <algorithm>
#include <set>
#define LL unsigned long long
LL pri[30000];
bool vis[70];
set <LL> res;

int main(){
	LL Max=0;
	for(int i=0;i<=63;i++){
		Max+=(1ull<<i);
	}
	for(int i=2;i*i<=64;i++){
		if(!vis[i]){
			for(int j=i*i;j<=64;j+=i){
				vis[j]=1;
			}
		}
	}
	int pn=0;
	int num=0;
	res.insert(1);
	for(int i=2;i<=65536;i++){
		LL tmp=i;
		for(int j=1;j<=64;j++){
			if(vis[j]){
				res.insert(tmp);
			}
			if(tmp>Max/i) break;
			else tmp*=i;
		}
	}
    set<LL> :: iterator p;
	for(p=res.begin();p!=res.end();p++){
		printf("%llu\n",*p);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值