1722整数因子分解问题(分治算法)

Description

大于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共有多少种不同的分解式。

Input

输入数据只有一行,有1个正整数n (1≤n≤2000000000)。

Output

将计算出的不同的分解式数输出。

Sample

Input 

12

Output 

8
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string>
 4 #include <string.h>
 5 #include <algorithm>
 6 #include <math.h>
 7 #include <map>
 8 #include <vector>
 9 
10 using namespace std;
11 
12 int a[100005], top;
13 
14 void init(int n)
15 {
16     int i;
17     for(i=1;i<sqrt(n);i++)
18     {
19         if(n%i==0)
20         {
21             a[top++] = i;
22             a[top++] = n / i;
23         }
24     }
25     int x = sqrt(n);
26     if(x*x==n) a[top++] = x;
27 }
28 
29 int op()
30 {
31     int re[100005], i, j;
32     memset(re, 0, sizeof(re));
33     re[0] = 1;
34     for(i=0;i<top;i++)
35     {
36         for(j=0;j<i;j++)
37         {
38             if(a[i]%a[j]==0) re[i]+=re[j];
39         }
40     }
41     return re[top-1];
42 }
43 
44 int main()
45 {
46     int n, re;
47     scanf("%d", &n);
48     top = 0;
49     init(n);
50     sort(a, a+top);
51     re = op();
52     printf("%d\n", re);
53     return 0;
54 }

 

posted @ 2020-12-05 14:16  Xxiaoyu  阅读(498)  评论(0编辑  收藏  举报