TOJ 4111 Binomial efficient calculate C(n,k)

原创 2015年07月08日 13:56:57

For Mod 2^n,you can also use &(2^n-1),it will more faster.

M % (2^n) = M & (2^n-1);

It's use a way to get all quality factors of N!.

The portal:http://acm.tju.edu.cn/toj/showp4111.html

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>

const long long  N = 1000000;
long long tag[1000006],p[1000006],numtot;
long long Mod;

long long a1[1000006];

long long Fast_Power(long long n,long long k){
    long long ans = 1;
    while(k){
        if(k & 1) ans = ( ans * n ) % Mod;
        k /= 2;
        n = ( n * n ) % Mod;
    }
    return ans;
}

void Get_prime()
{
    long long  cnt = 0;
    memset(tag,0,sizeof(tag));
    for (long long  i = 2; i <= N; i++)
    {
        if (!tag[i])    p[cnt++] = i;
        for (long long  j = 0; j < cnt && p[j] * i <= N; j++)
        {
            tag[i*p[j]] = 1;
            if (i % p[j] == 0)
                break;
        }
    }
    numtot = cnt;
}

void Deal_with(){
    long long  T,n,k;
    scanf("%lld",&T);
    while(T--){
        scanf("%lld %lld",&n,&k);
        //memset(a1,0,sizeof(a1)); Can't use memset,It's TLE.
        int tempi;
        for(long long  i=0;i<numtot;i++){
            if(p[i] > n)break;
            a1[p[i]] = 0;
            for(long long  j=p[i];j<=n;j *= p[i])a1[p[i]] += n / j;
            for(long long  j=p[i];j<=k;j *= p[i])a1[p[i]] -= k / j;
            for(long long  j=p[i];j<=n-k;j *= p[i])a1[p[i]] -= (n-k) / j;
            tempi = i;
        }
        Mod = 1;
        for(long long  i=1;i<=32;i++){
            Mod *= 2;
        }
        long long ans = 1;
        for(long long  i=0;i<=tempi;i++){//It should use tempi,Because if i > tempi,it's no initialization.
            ans = ( ans * Fast_Power(p[i],a1[p[i]]) ) % Mod;
        }
        printf("%lld\n",ans);
    }
}

int main(void){
    Get_prime();
    Deal_with();
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 2582 f(n)(找规律,素数筛选,优化)

f(n) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi...
  • acm_cxq
  • acm_cxq
  • 2016年06月08日 21:19
  • 410

转载:优先队列:BinomialQueue 二项队列

转载:http://blog.sina.com.cn/s/blog_ac9fdc0b0101l1md.html 优先队列:BinomialQueue二项队列   (2...
  • cainiaozr
  • cainiaozr
  • 2013年07月12日 08:48
  • 513

fzu 1752 A^B mod C(快速乘+快速幂取模)

题目:http://acm.fzu.edu.cn/problem.php?pid=1752  Problem Description Given A,B,C, You should qui...
  • theArcticOcean
  • theArcticOcean
  • 2015年08月03日 16:43
  • 789

杭电ACM1003C做法

Max Sum Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculat...
  • SuperBeauty
  • SuperBeauty
  • 2015年10月19日 08:48
  • 682

Web性能压力测试工具之ApacheBench(ab)

PS:网站性能压力测试是性能调优过程中必不可少的一环。只有让服务器处在高压情况下才能真正体现出各种设置所暴露的问题。Apache中有个自带的,名为ab的程序,可以对Apache或其它类型的服务器进行网...
  • paincupid
  • paincupid
  • 2017年12月18日 17:07
  • 53

洛谷P1036 选数

题目描述 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19...
  • PeterZ1997
  • PeterZ1997
  • 2017年07月27日 22:18
  • 366

选择问题(一组N个数确定其中的第K个最大者)

1、该问题的一种解法是讲这N个数读进一个数组中,在通过某种简单排序算法(如:冒泡排序),以递减的 顺序将数组排序,然后返回位置k上的元素。(c语言编写,输入输出c++,纯c的话改过来即可) #incl...
  • GWCLB_2013
  • GWCLB_2013
  • 2015年04月26日 16:07
  • 1906

CCF NOI1050 矩阵乘法

问题链接:CCF NOI1050 矩阵乘法。 时间限制: 1000 ms  空间限制: 262144 KB 题目描述    计算两个矩阵的乘法。n*m阶的矩阵A乘以m*k阶的矩阵B得到的...
  • tigerisland45
  • tigerisland45
  • 2017年04月26日 03:40
  • 503

单调队列——广告印刷

最近,afy决定给TOJ印刷广告,广告牌是刷在城市的建筑物上的,城市里有紧靠着的N个建筑。 afy决定在上面找一块尽可能大的矩形放置广告牌。我们假设每个建筑物都有一个高度, 从左到右给出每个建筑物的高...
  • code_pang
  • code_pang
  • 2013年11月04日 12:09
  • 2553

nyoj256C小加 之 级数求和(精度问题)

C小加 之 级数求和 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 最近,C小加 又遇到难题了,正寻求你的帮助。 已知:Sn= 1+1/2+1/3+…+1...
  • chao1983210400
  • chao1983210400
  • 2013年12月08日 14:16
  • 978
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TOJ 4111 Binomial efficient calculate C(n,k)
举报原因:
原因补充:

(最多只允许输入30个字)