TopCoder SRM 424 Div1 Easy ProductOfDigits
問題
各桁の積がnに等しいような数Xのうち、桁数最小のものの桁数を求めよ。
そのような数Xが存在しないときは-1を返せ。
制約条件
n≦10^9
方針
nを素因数分解する。
nが11以上の素因数を持つとき、どんな数Xの各桁の積もnに等しくなることはないので、-1を返す。
そうでないときは、必ずXが存在する。
Xの最小の桁数を求めたい。
5以上の素因数は、他の数と組にすることができないのでそれ一つで一桁を使う。
3は他の2一個または3一個と組にできる。
貪欲に3同士をペアにして、最後に余った3を(できるなら)2とペアにしてやる。
2は3つまでペアにできるので、できるだけペアにする。
ソースコード
class ProductOfDigits { public: int smallestNumber(int N) { if(N==1)return 1; map<int,int> f; for(int i=2;i*i<=N;i++)if(N%i==0){ int c=0; while(N%i==0)N/=i, c++; f[i]=c; } if(N>1)f[N]=1; int two=f[2], three=f[3], five=f[5], seven=f[7]; fr(i,f)if(i->first>7)return -1; int ans=five+seven; ans+=three/2; ans+=three%2; two-=three%2; ans+=(two+2)/3; return ans; } };