SRM-424 250pt: ProductOfDigits

keyword

整数 10進数 C++

問題概要

整数N(<10^9)が与えられる。各桁の数字の積がNに等しくなるような数字のうち、最小の桁数を求める問題。

解法

素因数分解したとき10以上の素数があれば不可能。そうでないときは、桁数を縮めるように8,9,6,4の順で割っていく。

int smallestNumber(int N) {
    if(N==1) return 1;
    int ret=0;
    vector<int> ns;
    while(N%8==0) N/=8, ns.push_back(8);
    while(N%9==0) N/=9, ns.push_back(9);
    while(N%6==0) N/=6, ns.push_back(6);
    while(N%4==0) N/=4, ns.push_back(4);
    while(N%5==0) N/=5, ns.push_back(5);
    while(N%3==0) N/=3, ns.push_back(3);
    while(N%7==0) N/=7, ns.push_back(7);
    while(N%2==0) N/=2, ns.push_back(2);
    if(N!=1) return -1;
    return SZ(ns);
}