草稿

整数快速幂

#include <bits/stdc++.h>

using namespace std;

int quickpow(int x,int n){
    int res=x,ans=1;
    while(n){
        if(n&1){
            ans*=res;
        }
        res*=res;
        n>>=1;
    }
    return ans;
}
int main()
{
    int x,n;
    scanf("%d%d",&x,&n);
    printf("%d\n",quickpow(x,n));
    //cout << "Hello world!" << endl;
    return 0;
}

快速幂取模

typedef long long ll;
using namespace std;
ll qp(ll x,ll n,ll mod){
    ll res=1;
    while(n){
        if(n&ll(1)) res=res*x%mod;
        x=x*x%mod;
        n>>=1;
    }
    return res;
}

矩阵快速幂

#include <bits/stdc++.h>

using namespace std;
struct matrix{
    int m[N][N];
}ans,res;
matrix mul(matrix a,matrix b,int n){
    matrix tmp;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            tmp.m[i][j]=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
                tmp.m[i][j]+=a.m[i][k]*b.m[k][j];
    return tmp;
}
void quickpower(int m,int n){
    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i==j) ans.m[i][i]=1; else ans.m[i][j]=0;
    while(m){
        if(m&1){
            ans=mul(ans,res);
        }
        res=mul(res,res);
        m>>=1;
    }
}

int main()
{
    int m;
    quickpower(m,n);
    //cout << "Hello world!" << endl;
    return 0;
}

//最长不下降子序列

#include <bits/stdc++.h>
const int N=1000;
using namespace std;
int b[N],a[N];
int k=0;
int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		if(a[i]>=b[k]){
			b[++k]=a[i];
			continue;
		}
		for(int j=k;j>=1;j--){
			if(a[i]>b[j]){
				b[j+1]=a[i];
				break;
			}
		}
	}
	printf("%d\n",k);
	return 0;
} 

二叉树的遍历

#include <iostream>
const int N=100;
using namespace std;
int tr[N];
int n;
void xxbl(int node){
    cout<<tr[node]<<" ";
    if(node<<1<=n) xxbl(node<<1);
    if((node<<1)+1<=n) xxbl((node<<1)+1);
}
void zxbl(int node){
    if(node<<1<=n) zxbl(node<<1);
    cout<<tr[node]<<" ";
    if((node<<1)+1<=n) zxbl((node<<1)+1);
}
void hxbl(int node){
    if(node<<1<=n) hxbl(node<<1);
    if((node<<1)+1<=n) hxbl((node<<1)+1);
    cout<<tr[node]<<" ";

}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>tr[i];
    //xxbl(1);
    //zxbl(1);
    hxbl(1);
    //cout << "Hello world!" << endl;
    return 0;
}

已知先序遍历和中序遍历,求层序遍历

#include <iostream>
const int N=100;
using namespace std;
int tr[N];
int a[N],b[N];
int n;
int cnt=0;
void build(int node,int l,int r,int l1,int r1){
    tr[node]=a[l];
    int k;
    for(int i=l1;i<=r1;i++) if(b[i]==node){ k=i;break;}
    if(node<<1<=n) build(node<<1,l+1,l+k-l1,l1,k-1);
    if((node<<1)+1<=n) build((node<<1)+1,l+k-l1+1,r,k+1,r1);
}
void hxbl(int node){
    if(node<<1<=n) hxbl(node<<1);
    if((node<<1)+1<=n) hxbl((node<<1)+1);
    tr[node]=a[++cnt];
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>b[i];
    //cout << "Hello world!" << endl;
    build(1,1,n,1,n);
    for(int i=1;i<=n;i++) cout<<tr[i]<<" "<<endl;
    return 0;
}

回溯算法例子,输出n的全排列

#include <iostream>
const int N=100;
using namespace std;
int a[N];
int s[N];
int cnt;
void p(int n){
    for(int i=1;i<=n;i++){
        printf("%d ",s[i]);
    }
    puts("");
}
void dfs(int n,int level){
    if(level>n){
            p(n);
            return;
    }
    for(int i=1;i<=n;i++)
        if(a[i]==0) s[++cnt]=i,a[i]=1,dfs(n,level+1),a[i]=0,cnt--;

}
int main()
{
    //cout << "Hello world!" << endl;
    int n;
    while(cin>>n&&n!=0){
        cnt=0;
        dfs(n,1);
    }
    return 0;
}

n皇后问题(递归)

#include <bits/stdc++.h>
const int N=20;
using namespace std;
//int mp[N][N];
int mp[N];//使用一维数组
int ans;
int n;
/*
void op(){
    for(int i=1;i<=n;i++) printf("%d ",mp[i]); puts("");
}*/
bool ck(int x,int y){
    for(int i=1;i<=x-1;i++) if(x-i==abs(mp[i]-y)) return false;
    return true;
}
bool isempty(int m){
    for(int i=1;i<=n;i++) if(mp[i]==m) return false;
    return true;
}
void dfs(int now,int end){
    for(int i=1;i<=end;i++){
        if(ck(now,i)&&isempty(i)){
            if(now==end) ans++;
            else mp[now]=i,dfs(now+1,end),mp[now]=0;
        }
    }
}
int Nqueue(int n){
    memset(mp,0,sizeof(mp));
    ans=0;
    dfs(1,n);
    return ans;
}
int main()
{
    while(cin>>n&&n!=0){
        cout<<Nqueue(n)<<endl;
    }
    //cout << "Hello world!" << endl;
    return 0;
}
posted @ 2019-02-24 14:40  _yjun  阅读(283)  评论(0编辑  收藏  举报