设为首页 加入收藏

TOP

[组合数取模] 方法汇总
2015-01-27 10:00:52 】 浏览:6053
Tags:组合 方法 汇总

1.利用整数唯一分解定理,求(n+1-m) * (n+m)! / ( m! * (n+1)! )

任何正整数都有且只有一种方法写出其素因子幂相乘的形式。比如18= 2 * 3^2

A=(p1^k1)*(p2^k2)*(p3^k3)*(p4^k4)*......*(pn^kn) pi为素数

还有把阶层看作一个数,比m! 怎样求m!里面素数2的指数呢?

cnt=0; while(m) { m/=2; cnt+=m; } 就可以了,为什么呢?考虑m=4,则m!= 4*3*2*1, 第一次m/=2,是计算m!里面有多少个数能整除2的(有4,2),所以cnt+=2,有两个数贡献

了两个素数2,接下来第二次m/=2,是计算m!里面有多少个数能整除4的,有1个数又贡献了一个素数2.

所以先预先筛出最大范围内的素数,然后考虑每个素数就好了,关键是求出整个式子的该素数的指数是多少。

模板:

bool isprime[maxn*2+10];
int prime[maxn*2+10];
int len=0;//素数的个数
int n,m;
void sieve(int n)//筛n以内的素数
{
    for(int i=0;i<=n;i++)
        isprime[i]=1;
    isprime[0]=isprime[1]=0;
    for(int i=2;i<=n;i++)
        if(isprime[i])
        {
            prime[len++]=i;
            for(int j=2*i;j<=n;j+=i)
                isprime[j]=0;
        }
}
int cal(int p,int n)//计算n!里面有多少个p相乘
{
    int ans=0;
    while(n)
    {
        n/=p;
        ans+=n;
    }
    return ans;
}

int main()
{
        sieve(maxn*2);
        long long ans=1;//记得要用long long
        cin>>n>>m;
        int nm=n+1-m;
        for(int i=0;i
  
   =mod)
                    ans%=mod;
            }
        }
        cout<
    
    


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇HDU 5093 Battle ships(二部图最.. 下一篇HDOJ 2196 Computer 树的直径

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目