ideon.comで
time: 2.92 memory: 27640
まあまあです。
#include<queue>
#include<iostream>
#include<math.h>
#include<map>
const int LIMIT=9000*1000;
const int LAST=500500;
const long long int MOD=500500507;
bool memo[LIMIT];
struct E{
int a;
long long int b,r;
bool operator<(const E& e)const{
return log(a)*(r-r/2)>log(e.a)*(e.r-e.r/2);
}
};
int main(){
std::priority_queue<E> pq;
E e1;
for(int i=0;i<LIMIT;i++)memo[i]=true;
for(int i=2;i<LIMIT;i++){
if(memo[i]==false)continue;
e1.a=i;
e1.r=1;
e1.b=i;
pq.push(e1);
for(int j=i*2;j<LIMIT;j+=i){
memo[j]=false;
}
}
std::cout<<pq.size()<<" ";
long long int ans=1;
std::map<int,long long int> calc;
std::map<int,long long int>::iterator it;
for(int i=1;i<=LAST;i++){
e1=pq.top();
pq.pop();
calc[e1.a]=e1.b;
e1.r=e1.r*2+1;
e1.b=((e1.b*e1.b)%MOD*e1.a)%MOD;
pq.push(e1);
}
for(it=calc.begin();it!=calc.end();it++){
ans=(ans*(*it).second)%MOD;
}
std::cout<<ans<<"\n";
}
最終更新:2015年03月01日 21:52