Problem 347 「二つの素数で割り切れる最大の整数」 †
3162以上の素数と3162以上の素数は0。
3162以上の素数と3162以下の素数のケースはまとめて計算。
3162以下の素数と3162以下の素数の場合は全探索。
#include<stdio.h>
#include<map>
#include<vector>
#include<iostream>
#include<set>
#include<string.h>
#include<algorithm>
const int L=3162;
const int LIMIT=1000*10000;
bool isP[LIMIT+1];
std::map<__int64,__int64> memo;
std::vector<__int64> vec;
__int64 f(int p,int p2){
__int64 ans=0,a1,b1;
for(__int64 a=p;a<=LIMIT;a*=p){
for(__int64 b=p2;a*b<=LIMIT;b*=p2){
if(ans<a*b){
ans=a*b;
a1=a;
b1=b;
}
}
}
//std::cout<<"("<<ans<<" "<<a1<<" "<<b1<<")";
return ans;
}
int main(){
memset(isP,true,sizeof(isP));
isP[0]=false;
isP[1]=false;
for(int i=2;i*i<=LIMIT;i++){
if(isP[i]==false)continue;
for(int j=i*2;j<=LIMIT;j+=i){
isP[j]=false;
}
}
for(int i=2;i<=LIMIT;i++){
if(isP[i]){
if(i>L){
memo[i]=i;
}else{
vec.push_back(i);
}
}
}
std::map<__int64,__int64>::iterator it,it2;
__int64 sum=0;
for(it=memo.begin();it!=memo.end();it++){
sum+=(*it).second;
(*it).second=sum;
}
memo[0]=0;
__int64 ans=0;
for(int i=0;i<vec.size();i++){
__int64 a=vec[i];
__int64 p=vec[i];
while(a<=L){
it=memo.upper_bound(LIMIT/a);
it--;
it2=memo.upper_bound(LIMIT/(a*p));
it2--;
ans+=a*((*it).second-(*it2).second);
a*=p;
}
}
std::cout<<ans<<"\n";
for(int i=0;i<vec.size();i++){
for(int j=i+1;j<vec.size();j++){
ans+=f(vec[i],vec[j]);
}
}
std::cout<<"ans="<<ans<<"\n";
}
最終更新:2015年11月26日 23:26