開啟章節選單
10858 Unique Factorization
題目說明
給一個數字,輸出他的因數分解的組合數量,再以字典序輸出這些組合(每一個組合都是排序的),例如 輸入30會輸出 4(總共4種組合) 2 3 5 2 15 3 10 5 6 輸入測資直到測資為0,每一筆測資都只有一個數字
解題思路
用遞迴的方法解決,30的因數是2,3,5,6,10,15 recursive(30)= 2recursive(30/2)+3recursive(30/3)+5recursive(30/5)+6recursive(30/6)+... 但是我們只需要由大到小的排列 6*recursive(30/6)這個組合,recursive(5)所有數字都比6小,所以6之後所有的因數都不用計算
總結只需要計算 2recursive(30/2)+3recursive(30/3)+5*recursive(30/5) 準確來說,只需要計算小於或等於sqrt(30)的因數
套用到其他數字就是 假設n的小於或等於sqrt(n)的因數為a0,a1,...,ak; recursive(n)=a0 _ recursive(n/a0)+ ... +ak _ recursive(n/ak)
#include<iostream> using namespace std; static int k; void rec(int d,int n,int total,string p,string& ans,int& per) { if(total==k&&p!=" "+to_string(k)&&p.length()>1){ ans+=p.substr(1)+"\n"; per++; } for(int i=d;i<=n;i++) { if(n%i==0) rec(i,n/i,total*i,p+" "+to_string(i),ans,per); } } int main() { int n; while(cin>>n&&n) { k=n; string s; int per=0; rec(2,n,1,"",s,per); cout<<per<<endl; cout<<s; } }