poj 2992

自己写个死活都TLE。。。。看的别人的才过。

任意一个数都可以分解为

n=p1^e1*p2^e2*...*pn^en,,,,

其中p1,,p2,,pn为素数,,,,,

则n的约数的个数为(e1+1)*(e2+1)*...*(en+1),,,,

利用筛法,,我们可以求出1~n中每个数的所有素约数的指数,,,,,

C(n,k)=n!/k!/(n-k)!,,,,,,

over,,,,

//============================================================================
// Name        : 2992.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

int e[432][432], sum[432][432];
bool prime[432];
int num, n, k;
long long ans;


int main(){
	freopen("a.txt", "r", stdin);
	for(int i = 2;i < 432;i++){
		if(!prime[i]){
			++num;
			e[i][num]++;
			for(int j = i<<1;j < 432;j+=i){
				prime[j] = true;
				e[j][num] = e[j/i][num]+1;
			}
		}
	}
	for(int i = 1;i < 432;i++){
		for(int k = 1;k <= num;k++){
			sum[i][k] = sum[i-1][k]+e[i][k];
		}
	}
	while(scanf("%d%d", &n, &k)!=EOF){
		ans = 1;
		for(int i = 1;i <= num;i++){
			ans = ans*(sum[n][i] - sum[k][i] - sum[n-k][i]+1);
		}
		printf("%I64d\n", ans);
	}
	return 0;
}

  

转载于:https://www.cnblogs.com/ACKOKO/articles/2125820.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值