1. 程式人生 > >整數因子分解問題

整數因子分解問題

題目描述

大於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;
}