快速幂
就是log减少计算,在指数是偶数的时候直接指数除2的结果相乘mod就行,奇数就底数乘以指数-1的结果
注意mod是%不要手残直接写mod
底数b有可能是0的,要特判
经典二分
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> int getnum(int b,int p,int k) { if(b==0||k==0) return 0; if(p==0) return 1; if(p%2) return (getnum(b,p-1,k)*b%k); long long temp=getnum(b,p/2,k); return temp*temp%k; } int main() { int b,p,k; scanf("%d %d %d",&b,&p,&k); int ans=getnum(b%k,p,k); printf("%d^%d mod %d=%d",b,p,k,ans); return 0; }
归并排序
注意内部归并好以后,要记得把temp的值还给a,递归和非递归都有
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<algorithm> #include<math.h> using namespace std; int n; int a[100005]; void merge(int a[],int left1,int right1,int left2,int right2) { int temp[100005]; int len=0; int l1=left1; int l2=left2; while(l1<=right1 && l2<=right2) { if(a[l1]<=a[l2]) temp[len++]=a[l1++]; else temp[len++]=a[l2++]; } while(l1<=right1) temp[len++]=a[l1++]; while(l2<=right2) temp[len++]=a[l2++]; for(int i=0;i<=len-1;i++) a[left1+i]=temp[i]; } void mergeSort(int a[],int left,int right) { if(left>=right) return; int mid=(left+right)/2; mergeSort(a,left,mid); mergeSort(a,mid+1,right); merge(a,left,mid,mid+1,right); } void mergeSort2(int a[]) { for(int step=2;step/2<=n;step=step*2) { for(int i=0;i<=n-1;i=i+step) { int mid=i+step/2-1; if(mid+1<n) merge(a,i,mid,mid+1,min(i+step-1,n-1)); } } } int main() { scanf("%d",&n); for(int i=0;i<n;i++) scanf("%d",&a[i]); mergeSort2(a); for(int i=0;i<n;i++) printf("%d ",a[i]); return 0; }
时间才能证明一切,选好了就尽力去做吧!