POJ-2992 Divisors---组合数求因子数目

题目链接:

https://cn.vjudge.net/problem/POJ-2992

题目大意:

给出组合数Cnk,求出其因子个数,其中n,k不大于431,组合数的值在long long范围内

解题思路:

由于只有431种阶乘,先预处理431中素数,再预处理出每一个阶乘里面所含的素因子的指数,然后对于组合数,直接用素因子指数相减即可。

求出的质因子指数,就可以用定理直接求因子个数。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 using namespace std;
 5 typedef long long ll;
 6 bool not_prime[1000];
 7 int prime[200], tot;
 8 void sieve(int n)
 9 {
10     for(int i = 2; i <= n; i++)
11     if(!not_prime[i])
12     {
13         prime[tot++] = i;
14         for(int j = i * 2; j <= n; j += i)
15             not_prime[j] = 1;
16     }
17 }
18 int a[500][100];//a[i][j]表示i的阶乘中素数prime[j]的指数
19 void init(int n)
20 {
21     for(int i = 2; i <= n; i++)
22     {
23         for(int j = 0; j < tot && prime[j] <= n; j++)
24         {
25             if(i % prime[j] == 0)
26             {
27                 int t = i;
28                 while(t % prime[j] == 0)
29                 {
30                     t /= prime[j];
31                     a[i][j]++;
32                 }
33             }
34             a[i][j] += a[i - 1][j];
35         }
36     }
37     /*for(int i = 1; i <= 50; i++)
38     {
39         for(int j = 0; j < tot; j++)
40         {
41             if(a[i][j])
42             {
43                 printf("%d %d %d\n", i, prime[j], a[i][j]);
44             }
45         }
46     }*/
47 }
48 int main()
49 {
50     sieve(431);
51     init(431);
52     int n, k;
53     while(scanf("%d%d", &n, &k) != EOF)
54     {
55         int ant[100];
56         for(int i = 0; i < tot; i++)
57             ant[i] = a[n][i] - a[k][i] - a[n - k][i];
58         ll ans = 1;
59         for(int i = 0; i < tot; i++)
60             ans *= (ant[i] + 1);
61         printf("%lld\n", ans);
62     }
63     return 0;
64 }

原文地址:https://www.cnblogs.com/fzl194/p/9038538.html

时间: 2024-10-11 13:59:03

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

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循环从

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!的素因子 -

Poj2992Divisors 组合数求因子的个数

Divisors Description 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

hdu 6069 Counting Divisors(求因子的个数)

Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 3170    Accepted Submission(s): 1184 Problem Description In mathematics, the function d(n) denotes the number of divisors of

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

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

题意:给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了.

POJ2992:Divisors(求N!因子的个数,乘性函数,分解n!的质因子)

题目链接:http://poj.org/problem?id=2992 题目要求: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? 题目解析:这题也是TLE了无数遍,首先说一下求因子数目的函数是积性函数,积性函数即f(n)=f(a)*f(b)