排列组合的写法_排列组合的写法 | 学步园

这篇博客探讨了如何实现不超时的组合数计算方法,包括一个非递归的优化算法,用于快速求解大数的组合数。博主通过C(n, k)的非递归实现避免了超时问题,并在代码中展示了其实现细节。此外,还对比了一个简单的递归实现,指出其在处理大数值时可能存在的效率问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define setbit(x,y) x|=(1<

#define clrbit(x,y) x&=~(1<

#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

#include

#include

#include

#include

#include

#include

#include

#include

#define setbit(x,y) x|=(1<

#define clrbit(x,y) x&=~(1<

#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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值