#include #include using namespace std; //素数判定,素数でない時は割り切れる数を返す // long long is_prime(long long n){ if(n < 2) return -1;//素数ではない if(n % 2==0)return 2; for(long long d = 2; d < sqrt(n);d++){ if(n % d == 0) return d; } return 0;//素数 } long long func(long long n){ long long tmp = is_prime(n); //cout << "func_ " << n << "called" << " tmp:" << tmp << endl; if(tmp==0){ return n-1; }else{ return func(tmp) + func(n/tmp); } } int main(){ long long n;//立方体をn個の合同な直方体に分割したい。 cin >> n; //cout << "tes" < さらに3等分(2time) ->total 4time 多分最大は必ずn-1回? 問題は最小で済ませる時。 15: tmax:14 tmin:5等分して3等分? -> func(3) + func(15/3) 増える数について考察してみる。 N等分されているとき。。。(N+1)個あることになる。 これを半分にすれば2(N+1)個作れる。 切る回数はN+1回か? ->6の場合では N=2なので3 さらに半分で4(N+1)になる?切る回数はN+2回? 切る順番に影響されるか? 横2回、縦1回について・・・ yyt -> 3*2-> 6 yty -> 2*2*... tyy 合同にするには必ず、X→Y→Z軸にそって等分していかないとだめでは? */ long long Tmin = 0,Tmax = n-1; // cout << n << " " << Tmin << " " << Tmax<