立方数になるような桁の置換をちょうど5つもつ最小の立方数を求めよ.
解法
立法数を桁に0~9の数字が何回あらわれているか写像をとってカウントして、結果が5つならそれが答えです。
#include<stdio.h>
#include<map>
#include<iostream>
#include<set>
struct E{
__int64 num;
int count[10];
bool operator<(const E& e)const{
for(int i=0;i<10;i++){
if(count[i]!=e.count[i])return count[i]<e.count[i];
}
return false;
}
void set(__int64 num1){
num=num1;
for(int i=0;i<10;i++)count[i]=0;
while(num1>0){
count[(int)(num1%10)]++;
num1/=10;
}
}
};
int main(){
std::map<E,int> memo;
__int64 ketaAgari=10;
E e1;
std::map<E,int>::iterator it;
for(__int64 i=1;;i++){
__int64 i3=i*i*i;
e1.set(i3);
if(ketaAgari<=i3){
ketaAgari*=10;
__int64 ans=-1;
for(it=memo.begin();it!=memo.end();it++){
if((*it).second==5){
if(ans==-1||ans>(*it).first.num){
ans=(*it).first.num;
}
}
}
if(ans!=-1){
std::cout<<ans;
return 0;
}
memo.clear();
}
memo[e1]++;
}
}
最終更新:2014年12月12日 02:14