zoukankan      html  css  js  c++  java
  • 因式分解(分治)

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

  • 相关阅读:
    scrapy下载图片第一波
    scrapy之防ban策略
    xml之dtd约束
    Java jdbc相关
    XSS获取cookie
    反射型XSS & DVWA
    MySQL数据库设计规范
    SQL Server 查询指定时间是一年当中的第几周
    js验证15位或18位身份证
    C# Process.Start()
  • 原文地址:https://www.cnblogs.com/yelan/p/2961925.html
Copyright © 2011-2022 走看看