遞歸--練習5--noi1751分解因數
阿新 • • 發佈:2017-06-22
cst ont 因式分解 page tdi () std 問題 enter
遞歸--練習5--noi1751分解因數
一、心得
想清楚子問題
想清楚遞推表達式
沒有全部AC說明還有自己沒有想到的位置,試邊界情況和查看題目要求
二、題目
1751:分解因數
- 總時間限制:
- 1000ms
- 內存限制:
- 65536kB
- 描述
- 給出一個正整數a,要求分解成若幹個正整數的乘積,即a = a1 * a2 * a3 * ... * an,並且1 < a1 <= a2 <= a3 <= ... <= an,問這樣的分解的種數有多少。註意到a = a也是一種分解。
- 輸入
- 第1行是測試數據的組數n,後面跟著n行輸入。每組測試數據占1行,包括一個正整數a (1 < a < 32768)
- 輸出
- n行,每行輸出對應一個輸入。輸出應是一個正整數,指明滿足要求的分解的種數
- 樣例輸入
-
2 2 20
- 樣例輸出
-
1 4
三、AC代碼
1 /* 2 noi1751分解因數 3 20 4 2*10 5 2*2*5 6 4*5 7 20 8 從1到n 9 尋找子問題 10 當分離出來一個因數之後,剩下的數是一個子問題 11 12 24 13 2*12(所有12的情況)12 2*6 3*4 2*2*3 14 3*8(所有8的情況)1*8 2*4 2*2*2 15 4*6(所有6的情況)6 2*3 16 24這種 17 18 我開始就沒把遞推關系式想清楚 19 遞推表達: 20 因式分解21 f(20)=1+f(10)+f(5) 22 2 1 23 f(24)=1+f(12)+f(8)+f(6) 24 f(12)=1+f(6)+f(4)//1+2+2 25 f(8)=1+f(4)//1+2 26 f(6)=1+f(3)//1+1 27 28 */ 29 #include <iostream> 30 #include <cstdio> 31 using namespace std; 32 int f(int n,int m){ 33 int ans=1;//算上本身那種情況 34 if(n==1) return 0; 35 for(int i=m;i*i<=n;i++){//從2開始遍歷找所有的能分解的情況 36 if(n%i==0){ 37 //上面相當於把子問題漏掉的那種情況加上了 38 ans+=f(n/i,i);//把子問題的所有情況也加上 39 //因為 a = a1 * a2 * a3 * ... * an,並且1 < a1 <= a2 <= a3 <= ... <= an, 40 //因為後面的因數要比前面大,漏了這一個 41 } 42 } 43 return ans; 44 } 45 int main(){ 46 //freopen("in.txt","r",stdin); 47 int n; 48 cin>>n; 49 for(int i=1;i<=n;i++){ 50 int a; 51 cin>>a; 52 int ans=f(a,2); 53 cout<<ans<<endl; 54 } 55 56 return 0; 57 }
所以遞歸裏面多了一個變量m、
遞歸--練習5--noi1751分解因數