整數因子分解問題
阿新 • • 發佈:2019-02-08
題目描述
大於1 的正整數n可以分解為:n=x1*x2*…*xm。
例如,當n=12 時,共有8 種不同的分解式:
12=12;
12=6*2;
12=4*3;
12=3*4;
12=3*2*2;
12=2*6;
12=2*3*2;
12=2*2*3。
對於給定的正整數n,程式設計計算n共有多少種不同的分解式。
輸入每組測試資料的第一行有1 個正整數n(n<=10^10)。
輸出將計算出的不同的分解式數輸出。
樣例輸入12
樣例輸出
8
這道題如果用搜索就需要用到記憶化搜尋,用map存,然後優化至sqrt(n)就
可以求出來。
另外一種用動態規劃,
12的因子有
1 2 3 4 6 12
1 1 1 2 3 8
那麼就只需要分解因子就行。
#include <stdio.h> #include <map> using namespace std; map < int, int > vis; int dfs ( int n ) { if ( n == 1 ) return 1; if ( vis[n] ) //搜尋過 return vis[n]; int s = 1; for ( int i = 2; i*i <= n; i ++ ) //優化至sqrt(n) if ( n%i == 0 ) //因子 { s = s+dfs ( i ); if ( i != n/i ) //不相等就搜下一層 s = s+dfs ( n/i ); } vis[n] = s; return s; } int main ( ) { int n; scanf ( "%d", &n ); printf ( "%d", dfs ( n ) ); return 0; }