積和数に関する問題。
解法
もしかしたら何か数式のようなものがあるのかもしれませんが何も考えない全探索で片が付きました。
#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