标签:
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 }
分治与递归:把一个难以解决的问题分解到可以解决的范畴
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 }
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 }
标签:
原文地址:http://www.cnblogs.com/do-it-best/p/5444634.html