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<cstring>
#include<cstdlib>
#include<vector>
using namespace std;
//C(n,k)=n!/((n-k)!*k!)
struct node
{
    int x,num;
    node(int a,int b){x=a;num=b;}
};
vector<node> pri[444];
void init()
{
    for(int i=1;i<=435;i++)
    {
        int tn=i;
        for(int j=2;j*j<=tn;j++)
        {
            int cnt=0;
            if(tn%j==0)
            {
                while(tn%j==0) {tn/=j;cnt++;}
                pri[i].push_back(node(j,cnt));
            }
        }
        if(tn>1) pri[i].push_back(node(tn,1));
    }
}
int pnum[444];
long long cal(int n,int k)
{
    int tk=n-k;
    memset(pnum,0,sizeof(pnum));
    for(int i=n;i>=1;i--) for(int j=0;j<pri[i].size();j++) pnum[pri[i][j].x]+=pri[i][j].num;
    for(int i=tk;i>=1;i--) for(int j=0;j<pri[i].size();j++) pnum[pri[i][j].x]-=pri[i][j].num;
    for(int i=k;i>=1;i--) for(int j=0;j<pri[i].size();j++) pnum[pri[i][j].x]-=pri[i][j].num;
    long long ans=1;
    for(int i=1;i<=n;i++)
    {
        if(pnum[i]) ans*=(pnum[i]+1);
    }
    return ans;
}
int main()
{
    init();
    int n,k;
    while(~scanf("%d%d",&n,&k))
    {
        printf("%lld\n",cal(n,k));
    }
    return 0;
}

poj 2992 Divisors 整数分解,布布扣,bubuko.com

时间: 2024-10-14 09:08:55

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

题意:给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 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!的素因子 -

[水+整数分解] poj 1365 Prime Land

题意: 给2*n个数,输入的这些数构成 sum=(a[1]^b[1])*(a[2]^b[2])... 其实就是整数分解完的数. 然后让你输出分解sum-1的结果. 从大到小. 思路: 就是输入麻烦点. 注意题目说了1的时候要输出空行. 代码: #include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #include"queue"

数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)

数学渣渣愉快的玩了一把数论,来总结一下几种常用的算法入门,不过鶸也是刚刚入门, 所以也只是粗略的记录下原理,贴下模板,以及入门题目(感受下模板怎么用的) (PS:文中蓝色字体都可以点进去查看百度原文) 附赠数论入门训练专题:点我打开专题(题目顺序基本正常,用以配套数论入门) 一.同余定理 简单粗暴的说就是:若 a-b == m 那么 a%m == b%m 这个模运算性质一眼看出...直接上入门水题: Reduced ID Numbers 附AC代码(这个也没啥模板....知道就好) #inclu

POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】

Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time Limit: 4000MS Description Given a big integer number, you are required to find out whether it's a prime number. Input The first line contains the num

POJ2429_GCD &amp;amp; LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】

GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 Description Given two positive integers a and b, we can easily calculate the greatest common divisor (GCD) and the least common multiple (LCM) of a and b.

POJ2429_GCD &amp; LCM Inverse【Miller Rabin素数测试】【Pollar Rho整数分解】

GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 Description Given two positive integers a and b, we can easily calculate the greatest common divisor (GCD) and the least common multiple (LCM) of a and b.

POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】

Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time Limit: 4000MS Description Given a big integer number, you are required to find out whether it's a prime number. Input The first line contains the num