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

  

posted @ 2011-08-03 09:58  KOKO's  阅读(406)  评论(0编辑  收藏  举报