码迷,mamicode.com
首页 > 其他好文 > 详细

divide conquer

时间:2016-04-28 23:46:45      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:

Merge  Merge_sort实现源码:

技术分享
 1 #include <iostream>
 2 #include <cstdio>
 3 #define inf 1e9
 4 using namespace std;
 5 
 6 void merge(int A[],int p,int q,int r)
 7 {
 8     int i,j;
 9     int n1=q-p+1;
10     int n2=r-q;
11     int L[n1+2],R[n2+2];
12     for(i=1;i<=n1;i++)
13         L[i]=A[p+i-1];
14     for(i=1;i<=n2;i++)
15         R[i]=A[q+i];
16     L[n1+1]=inf;
17     R[n2+1]=inf;
18     i=1;j=1;
19     for(int k=p;k<=r;k++)
20     {
21         if(L[i]<=R[j])
22         {
23             A[k]=L[i];
24             i++;
25         }
26         else
27         {
28             A[k]=R[j];
29             j++;
30         }
31     }
32 }
33 
34 void merge_sort(int A[],int p,int r)
35 {
36     int q;
37     if(p<r)
38     {
39         q=(p+r)/2;
40         merge_sort(A,p,q);
41         merge_sort(A,q+1,r);
42         merge(A,p,q,r);
43     }
44 }
45 
46 int main()
47 {
48     int A[20];
49     for(int i=1;i<=10;i++)
50         scanf("%d",&A[i]);
51     merge_sort(A,1,10);
52     for(int i=1;i<=10;i++)
53         printf("%3d",A[i]);
54     puts("");
55     return 0;
56 }
View Code

 

分治与递归:把一个难以解决的问题分解到可以解决的范畴

讲得不错:

1.子问题的解

2.规模增大的状态方程

3.递归的设计

 

快速乘法取模:a*b%c=(a%c)*b)%c

快速幂取模: a^b%c用下列方法:

考虑:(a^b)%c   b=p(n)*2^n+p(n-1)*2^n-1+....+p(0)*1

对于:p(i)=0的部分不用考虑,对于p(i)=1的部分

a^(2^i)%c=((a^(2^(i-1))%c*(a^(2^(i-1))))%c然后分治递归。

uva,374

技术分享
 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 int dfs(int b,int p,int m)
 7 {
 8     if(p==0) return 1;
 9     if(p==1) return b;
10     int a=dfs(b,p>>1,m);
11     a=a*a%m;
12     if(p%2)
13         return a*b%m;
14     return a;
15 }
16 
17 int main()
18 {
19     int b,p,m;
20     while(~scanf("%d%d%d",&b,&p,&m))
21     {
22         printf("%d\n",dfs(b%m,p,m));
23     }
24 }
View Code

 

技术分享
 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 int dfs(int b,int p,int m)
 7 {
 8     int pow=1;
 9     int tmp=b;
10     while(p)
11     {
12         if(p&0x1)
13             pow=pow*tmp%m;
14         tmp=tmp*tmp%m;
15         p>>=1;
16     }
17     return pow;
18 }
19 
20 
21 int main()
22 {
23     int b,p,m;
24     while(~scanf("%d%d%d",&b,&p,&m))
25     {
26         printf("%d\n",dfs(b%m,p,m));
27     }
28     return 0;
29 }
非递归版

 

divide conquer

标签:

原文地址:http://www.cnblogs.com/do-it-best/p/5444634.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!