zoukankan      html  css  js  c++  java
  • HDU 3037 Saving Beans (Lucas法则)

    主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3037

    推出公式为C(n + m, m) % p。 用Lucas定理求大组合数取模的值

    代码:

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    
    int t;
    long long n, m, p;
    
    long long pow(long long n, long long k) {
        if (k == 0) return 1;
        if (k == 1) return n;
        long long ans = pow(n * n % p, k>>1);
        if (k&1) ans = ans * n % p;
        return ans;
    }
    
    long long C(long long n, long long m) {
        if (m > n) return 0;
        m = min(m, n - m);
        long long zi = 1, mu = 1;
        for (long long i = 0; i < m; i++) {
    	zi = zi * (n - i) % p;
    	mu = mu * (i + 1) % p;
        }
        return zi * pow(mu, p - 2) % p;
    }
    
    long long Lucas(long long n, long long m, long long p) {
        if (m == 0) return 1;
        return C(n % p, m % p) * Lucas(n / p, m / p, p) % p;
    }
    
    int main() {
        scanf("%d", &t);
        while (t--) {
    	scanf("%lld%lld%lld", &n, &m, &p);
    	printf("%lld
    ", Lucas(n + m, m, p));
        }
        return 0;
    }


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    Elastic Search的学习
    数据分析相关
    爬虫相关
    Git 知识总结
    运维开发
    Flask
    Linux入门
    MYSQL, REDIS 等数据库的介绍
    Django的学习之路
    逆向工具Frida 环境搭建
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4875176.html
Copyright © 2011-2022 走看看