排列组合的写法

:C(,n m)不超时的:

#include <stdio.h>
#include <math.h>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring> 
#include <cmath>
#define setbit(x,y) x|=(1<<(y)) //将X的第Y位置1
#define clrbit(x,y) x&=~(1<<(y)) //将X的第Y位清0
#define sf scanf
#define pf printf
#define INF 1 << 29
#define eps 1e-6
const double PI = acos(-1.0);               
#define lint __int64
#define LL long long 
#define MAX 1e9 + 7
#define maxn 40005
//101^110=011 异或
#define ULLint unsigned long long //2^64-1>1.8*10^19 
#define clr(x) memset(x, 0, sizeof(x))
#define Clr(x) memset(x, -1, sizeof(x))

using namespace std;

char str[105];
__int64 n,k;
__int64 C(__int64 n,__int64 k)
{
	__int64 ans = 1;
	for(__int64  i = 1;i <= k;i++)
	{
		ans *= (n - i + 1);
		ans /= i;
	}
    return ans;
}
int main()
{
	while(scanf("%I64d%I64d",&n,&k) != EOF)
	{
		if(n == 0 && k == 0)
			break;
		if(2*k > n)
			k = n - k;
		printf("%I64d\n",C(n,k));
	}
    return 0;
}


简单的易超时(递归)

#include <stdio.h>
#include <math.h>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring> 
#include <cmath>
#define setbit(x,y) x|=(1<<(y)) //将X的第Y位置1
#define clrbit(x,y) x&=~(1<<(y)) //将X的第Y位清0
#define sf scanf
#define pf printf
#define INF 1 << 29
#define eps 1e-6
const double PI = acos(-1.0);               
#define lint __int64
#define LL long long 
#define MAX 1e9 + 7
#define maxn 40005
//101^110=011 异或
#define ULLint unsigned long long //2^64-1>1.8*10^19 
#define clr(x) memset(x, 0, sizeof(x))
#define Clr(x) memset(x, -1, sizeof(x))

using namespace std;

lint C (int n, int m) {
	if(0 == m) return 1;
	else return n * C(n - 1, m - 1) / m;
}
int main () {
	int n, m;
	while (2 == sf("%d%d", &n, &m)) {
		if(0 == n && 0 == m) break;
		pf("%I64d\n", C(n,m));
	}
	return 0;
}


你可能感兴趣的:(排列组合的写法)