因式分解(分治)

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1150

View Code
 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std ;
 4 int a[2000000], b[2000000] ;
 5 int n ;
 6 int main()
 7 {
 8     int i, j, t, num, q ;
 9     cin>>n ;
10     t = sqrt(n) ;
11     num = 0 ;
12     for(i=2; i<=t; i++)
13     if(n%i==0)
14     {
15         num++ ;
16         a[num] = i ;
17     }
18     q = num ;
19     if(t*t==n)
20     num-- ;
21     for(i=q; i>=1; i--)
22     {
23         num++ ;
24         a[num] = n/a[i] ;
25     }
26     num++ ;
27     a[num] = n ;
28     b[1] = 1 ;
29     for(i=2; i<=num; i++)
30     {
31         b[i] = 1 ;
32         for(j=i-1; j>=1; j--)
33         if(a[i]%a[j]==0)
34         b[i] += b[j] ;
35     }
36     cout<<b[num]<<endl ;
37 }

字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……

分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。

 

 

 

posted @ 2013-03-15 18:04  yelan@yelan  阅读(232)  评论(0编辑  收藏  举报