因式分解(分治)
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个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法。