POJ 2992 Divisors 求组合数因子个数

题目来源:POJ 2992 Divisors

题意:。。。

思路:素数分解的唯一性 一个数可以被分解成若干素数相乘 p1^x1*p2^x2*...*pn^xn

根据乘法原理 因子数为 (x1+1)*(x2+1)*...*(xn+1)

不能直接求出组合数 会溢出 也不能把每个乘的数分解因子 这样会超时

C(N,M)=N!/(M!*(N-M)!)

另dp[i][j] 代表为i的阶乘中j因子的个数(j是素数)

那么i素数的个数为dp[n][i]-dp[m][i]-dp[n-m][i]

最后for循环从1到n枚举i统计

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

const int maxn = 500;
int vis[maxn];
int prime[maxn];
int dp[maxn][maxn];
//筛素数
void sieve(int n)
{
	int m = sqrt(n+0.5);
	memset(vis, 0, sizeof(vis));
	vis[0] = vis[1] = 1;
	for(int i = 2; i <= m; i++)
		if(!vis[i])
			for(int j = i*i; j <= n; j += i)
				vis[j] = 1;
}

int get_primes(int n)
{
	sieve(n);
	int c = 0;
	for(int i = 2; i <= n; i++)
		if(!vis[i])
			prime[c++] = i;
	return c;
}

int get(int n, int m)
{
	int sum = 0;
	while(n)
	{
		sum += n/m;
		n /= m;
	}
	return sum;
}
void pre(int n)
{
	for(int i = 2; i <= n; i++)
	{
		for(int j = 2; j <= i; j++)
			dp[i][j] = get(i, j);
	}
}
int main()
{
	int c = get_primes(444);
	pre(444);
	int n, m;
	while(scanf("%d %d", &n, &m) != EOF)
	{
		long long ans = 1;
		for(int i = 2; i <= n; i++)
		{
			if(vis[i])
				continue;
			//C(N,M)=N!/(M!*(N-M)!)
			ans *= dp[n][i] - dp[m][i] - dp[n-m][i] + 1;
		}
		printf("%lld\n", ans);
	}
	return 0;
}

POJ 2992 Divisors 求组合数因子个数,布布扣,bubuko.com

时间: 2024-10-14 06:12:57

POJ 2992 Divisors 求组合数因子个数的相关文章

poj 2992 Divisors 整数分解

设m=C(n,k)=n!/((n-k)!*k!) 问题:求m的因数的个数 将m分解质因数得到 p1有a1个 p2有a2个 .... 由于每个质因数可以取0~ai个(全部取0就是1,全部取ai就是m)最后的答案就是(a1+1)*(a2+1)*....* 注意不能直接将m分解,因为太大,所以要先分解n,n-k,k,根据他们再来加减. #include <iostream> #include <cstdio> #include <cmath> #include<cstr

poj 2992 Divisors

题目链接:http://poj.org/problem?id=2992 题目大意:就是叫你求组合数C(n,m)的因子的个数. 思路:求解这题需要用到以下几个定理 1.对任意的n,可以这么表示 n=p1^e1*p2^e2*p3*e3*......pn^en .(p1,p2,p3......pn都为素数) 2.对任意的n的因子数为:(1+e1)*(1+e2)*(1+e3)*......*(1+en) 3.n!的素数因子=(n-1)!的素数因子+n的素数因子 4.C(n,k)的素因子=n!的素因子 -

Almost All Divisors(求因子个数及思维)

---恢复内容开始--- We guessed some integer number xx. You are given a list of almost all its divisors. Almost all means that there are all divisors except 11and xx in the list. Your task is to find the minimum possible integer xx that can be the guessed nu

poj2992 divisors 求组合数的约数个数,阶乘的质因数分解

Your task in this problem is to determine the number of divisors of Cnk. Just for fun -- or do you need any special reason for such a useful computation? Input The input consists of several instances. Each instance consists of a single line containin

组合数学+整数分解 POJ 2992 Divisors

题意:给n,k,求C(n,k)的约数的个数. 由于C(n,k)=n!/(k!*(n-k)!),所以只要分别把分子分母的素因子的次数求出来,再用分子的每个素因子的次数减去分母的每个素因子的次数就可以得到C(n,k)的素数分解式,约数个数就等于(p1+1)(p2+1)*...*(pn+1).这道题n,k的范围都是四百多,按理说O(N^2)的算法可以过的,但是测试数据太多了,暴力的方法会TLE.看别人的报告知道了求N!的某个素因子次数的递归算法,然后枚举每个素数,求出它在阶乘中的次数,就可以AC了.

POJ 1306 暴力求组合数

Combinations Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11049   Accepted: 5013 Description Computing the exact number of ways that N things can be taken M at a time can be a great challenge when N and/or M become very large. Challen

POJ 2249 暴力求组合数

Binomial Showdown Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22692   Accepted: 6925 Description In how many ways can you choose k elements out of n elements, not taking order into account? Write a program to compute this number. Inp

POJ 2992 求组合数的因子个数

求C(n,k)的因子个数 C(n,k) = (n*(n-1)*...*(n-k+1))/(1*2*...*k) = p1^k1 * p2^k2 * ... * pt^kt 这里只要计算出分子中素数因子个数减去分母中的个数 然后每一种因子都有 (cnt+1)种取的可能,乘一下就出来了 但是不能逐个因子分解,试了两次都错了,后来初始的时候,先将这432个数提前预处理分解好保存到vector中 然后用的时候直接提取就行 不然会因为数据量太大超时的 1 #include <iostream> 2 #i

POJ 2992-Divisors(求组合数质因子的个数)

Divisors Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2992 Appoint description:  System Crawler  (2015-04-24) Description Your task in this problem is to determine the number of divisors of C