您的位置:首页 > 其它

UVa 11752 The Super Powers(数学)

2015-02-04 20:58 337 查看
设一个数为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: