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