【排列组合】

——前提提要:做排列组合题目的时候,要注意long long的问题!!!!
题目一:有n封信,每封信都装错了对应的袋子里,问一共有几种“错误”形式?
多组数据1<=n<=20
例:2 3 输出:1 2
题解:本题为简单错排题。直接套公式即可
【注意要开long long,否则会爆】。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
typedef long long ll;
using namespace std;
int f[22],n;
ll fun(int n){
    if(n==1)return 0;
    if(n==2)return 1;
    return (ll)(n-1)*(fun(n-1)+fun(n-2));
}
int main(){
    while(scanf("%d",&n)!=EOF) 
          printf("%lld\n",fun(n));
    return 0;
}

 


题目二:有n个数,顺次排列a[i]=i;问字典序第m个排列是什么?
多组数据,1<=N<=1000, 1<=M<=10000
例:6 4 输出:1 2 3 5 6 4
11 8 1 2 3 4 5 6 7 9 8 11 10
题解:本题目运用next_permutation(a+1, a+1+n);这个函数。
所以代码如下:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
typedef long long ll;
using namespace std;
int f[22],n;
ll fun(int n){
    if(n==1)return 0;
    if(n==2)return 1;
    return (ll)(n-1)*(fun(n-1)+fun(n-2));
}
int main(){
    while(scanf("%d",&n)!=EOF) 
          printf("%lld\n",fun(n));
    return 0;
}

 

题目三:结婚典礼上,有n对新婚夫妇。玩一个新郎找新娘的游戏,有m个新郎找错了,一共有多少种可能?t组数据,1<=m<=n<=20;
例:2 输出:1
2 2 3
3 2
题解:错排+组合题。组合(杨辉三角),错排()因为有m个新郎选错了新娘,所以有n-m个新郎选对了新娘,所以可套用杨辉三角公式得到[函数见下面程序] sun(n,n-m),错排就不用说了,fun(m);根据乘法原理,选对的方法*选错的方法=最终选的可能数√

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
typedef long long ll;
using namespace std;
int n,m,t;
ll fun(int n){//错排 
    if(n==1)return 0;
    if(n==2)return 1;
    return (ll)(n-1)*(fun(n-1)+fun(n-2));
}
ll sun(int x,int y){//组合 
    if(y==0 || y==x) return (ll)1;
    return sun(x-1,y)+sun(x-1,y-1); 
}
int main(){
    //freopen("e.in","r",stdin);
    //freopen("e.out","w",stdout);
    scanf("%d",&t);
    while(t--){
        scanf("%d %d",&n,&m);
        ll a1=fun(m);
        ll a2=sun(n,n-m);
        cout<<a1*a2<<endl;
    }
    return 0;
}

 

posted @ 2019-07-09 23:43  #Cookies#  阅读(178)  评论(0编辑  收藏  举报