重复组合+lucas

从n个元素中有重复地取r个,不计其顺序,则不同的取法有C(r,n+r-1)种。

lucas模版

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MOD 10007
#define LL long long
using namespace std;

LL qmod(LL a, LL b, LL c)
{
    LL ans = 1;
    a = a % c;
    while(b)
    {
        if(b&1) ans = (ans*a)%c;
        b = b>>1;
        a = (a*a)%c;
    }
    return ans;
}

LL c(LL m,LL n)
{
    if(m < n)   return 0;
    if(m == n)  return 1;
    if(n > m-n) n = m-n;
    LL mm = 1,nn = 1;
    for(LL i = 0;i < n;i++)
    {
        mm = mm*(m-i)%MOD;
        nn = nn*(n-i)%MOD;
    }
    return mm*qmod(nn,MOD-2,MOD)%MOD;
}

LL lucas(LL m,LL n)
{
    LL ans = 1;
    while(m && n && ans)
    {
        ans = ans%MOD*c(m%MOD,n%MOD)%MOD;
        n /= MOD;
        m /= MOD;
    }
    return ans;
}

int main()
{
    LL n,m;
    while(~scanf("%lld%lld",&m,&n))    printf("%lld\n",lucas(m+n-1,n));
    return 0;
}

//XDOJ1057 
时间: 2024-10-12 15:50:19

重复组合+lucas的相关文章

PHP数组内容不重复组合排列算法

最近在做ecshop的商品库存模块,分别给一款商品的多个属性组合设置库存,如下图: 一款手机有不同颜色,屏幕尺寸,系统和电量,都要设置不同的库存,如果都要手动选择属性组合,则会耗费很多不必要的时间.假如打开页面时就已经设置好属性排列组合那就最好不过,因此想了整天,写了如下函数: 1 <?php 2 3 /* 4 Author:GaZeon 5 Date:2016-6-20 6 Function:getArrSet 7 Param:$arrs 二维数组 8 getArrSet(array(arra

递归求解几类排列组合问题(三、非重复组合排列)

三.非重复组合排列(含重复数字时,生成不重复组合排列) 对于搜索的深度很深或深度不固定的情况,则无法用枚举的方法来设置循环嵌套的层数,这时可以考虑用递归法来完成搜索任务.递归是一种常用算法,它是搜索的另一种实现方式.如果在算法设计中采用一个函数或过程直接或间接地调用它自身来解决问题的方法,则称该方法为递归算法.递归算法必须要设计好一个或若干个确定的递归终止条件. Sample Input 4 1 2 2 3 Sample Output 1223 1232 1322 2123 2132 2213

组合 Lucas定理

组合 Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u [Submit]   [Go Back]   [Status] Description 给出组合数C(n,m), 表示从n个元素中选出m个元素的方案数.例如C(5,2) = 10, C(4,2) = 6.可是当n,m比较大的时候,C(n,m)很大!于是xiaobo希望你输出 C(n,m) mod p的值! Input 输入数据第一行是一个正

FZU 2020 组合 (Lucas定理)

题意:中文题. 析:直接运用Lucas定理即可.但是FZU好奇怪啊,我开个常数都CE,弄的工CE了十几次,在vj上还不显示. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream>

不重复的组合

输入n个数,求这n个数构成的集合的所有子集,不允许输出重复的项 输入 3 1 1 3 输出 1 1 1 1 1 3 1 3 3 代码: #include<cstdio> #include<cstring> using namespace std; const int maxn = 100; int rcd[maxn],num[maxn],vis[maxn]; int n,m; int read_input() { if(scanf("%d",&n)==E

求字符串中元素的所有组合

我们知道具有N个元素的数字进行组合,总共有2^N种情况.那么,如何用程序实现输出这些组合呢???这个问题似乎比 求N个元素进行全排列 的问题要复杂一些,大家可以动脑想一下或者动手去写写程序,那么该采取什么样的思路才是简单的呢??? 常规的思路我们会想到使用循环或者递归,但是实际动手操作起来非常复杂,经常会把自己绕晕,或者很难看懂别人写的程序.下面介绍一种使用不同思路实现的方法,简单有效: 首先,把字符数组每一个元素用一个二进位表示,例如: A B C D E 1 1 1 1 1 ---> 于是它

如何用C表示排列组合?

问题来自<Linux C一站式编程>,是个挺有意思的题目. 2.定义一个数组,编程打印它的全排列.比如定义: #define N 3 int a[N] = { 1, 2, 3 }; 则运行结果是: $ ./a.out 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 3 1 2 程序的主要思路是: 把第1个数换到最前面来(本来就在最前面),准备打印1xx,再对后两个数2和3做全排列. 把第2个数换到最前面来,准备打印2xx,再对后两个数1和3做全排列. 把第3个数换到最前面来,准备打

如何实现一个数组所有的组合????

比如一个数组(1,2,3),如何实现所有的排列组合,如下所示: (1) (2) (3) (1,2) (1,3) (2,3) (1,2,3) Delphi/Pascal codefunction TestBit(Value, Index : integer) : Boolean;asm BT EAX, EDX SBB EAX, EAX AND EAX, 1end; procedure TForm1.Button1Click(Sender: TObject);const A : array[0..4

(回溯法)解决一系列组合问题

题目一: Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For example, If n = 4 and k = 2, a solution is: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 给你两个整数 n和k,从1-n中选择k个数字的组合.比如n=4,那么从1,2,3,4中选取两个数字的组合 解题思路:htt