1200:分解因數


分解因數

這題很明顯與 數的計數 有異曲同工之處。

但如果用它的方法來解這題卻是行不通的。

 

試分析一種情況,設m=20;

那么共有四種情況,分別為2*10,2*2*5,4*5,20;

但如果用上一種方法來做的話,卻有2*10,2*2*5,4*5,2*2*5,20共五種情況。

究其原因是因為左邊因式經過分解產生的組合可能會等於右邊因式經過分解產生的組合

那么如果只對一邊的因式(例如右邊)進行分解呢?顯然,此時有可能會漏掉某些組合。

一直卡在這個死胡同里沒走出來,直到看到題解……

題解:按着題目的要求一步步來,然后運用遞歸思想。

分解時,按題目要求保證后一個因式大於等於前一個因式。(其中值本身除外)

為遞歸函數再增加一個形參,用來約束因式分解時最小因式的大小。

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 int ans;
 5 void dfs(int v,int a){
 6     for(int i=a;i<=v;i++){
 7         if(v/i>=i&&v%i==0){
 8             dfs(v/i,i);
 9         }
10         if(i==v)ans++;
11     }
12 }
13 int main(){
14     int n,m;
15     cin>>n;
16     while(n--){
17         cin>>m;
18         dfs(m,2);
19         //答案至少為1
20         ans=ans>0?ans:1;
21         cout<<ans<<endl;
22         ans=0;
23     }
24     return 0;
25 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM