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

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2088
Problem 88 「積和数」 †
少なくとも2つの自然数 {a1, a2, ... , ak} の集合の和かつ積として表せる自然数Nを積和数と呼ぶ:N = a1 + a2 + ... + ak = a1 × a2 × ... × ak.
以下略


積和数に関する問題。

解法
もしかしたら何か数式のようなものがあるのかもしれませんが何も考えない全探索で片が付きました。


#include<stdio.h>
#include<map>
#include<set>
#include<iostream>

std::map<int,int> ans;
const int LIMIT=12000;

void saiki(int sum,int mult,int len,int down){
	int len2=mult-sum+len;
	if(len>1){
		if(ans.find(len2)==ans.end() || ans[len2]>mult) {
			ans[len2]=mult;
		}
	}
	for(int i=down;;i++){
		int mult2=mult*i;
		int sum2=sum+i;
		int len2=mult2-sum2+len+1;
		if(len2>LIMIT)break;
		saiki(sum+i,mult*i,len+1,i);
	}
}

void first(){
	for(int i=2;;i++){
		if(i*i-2*i+2>LIMIT)break;
		saiki(i,i,1,2);
	}
}
 


int main(){
	first();
	std::set<int> ans2;
	for(std::map<int,int>::iterator it=ans.begin();it!=ans.end();it++){
		ans2.insert((*it).second);
 	}
	__int64 ans3=0;
	for(std::set<int>::iterator it=ans2.begin();it!=ans2.end();it++){
 		ans3+=(*it);
	}
	std::cout<<"ans="<<ans3;
}
最終更新:2014年12月21日 18:17