UVa 11752 The Super Powers(数学)

来源:互联网 发布:网络手机高清直播软件 编辑:程序博客网 时间:2024/06/06 00:04

设一个数为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 longLL 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;}


0 0
原创粉丝点击