プロジェクトオイラー問500

http://odz.sakura.ne.jp/projecteuler/index.php?Problem%20500
2^500500個の約数を持つ最小の数を計算しMod500500507で割った数を答えよ。

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