hdu5698 Lucas 大组合数

来源:互联网 发布:南京大汉网络 双休 编辑:程序博客网 时间:2024/06/05 18:59

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


题目大意:有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几种方案,答案对1000000007取模。


思路:打个表,就可以找出规律了,求组合数。。。

        n = n + m - 4;
        m -= 2;


#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <fstream>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <vector>#include <map>#include <set>#include <iomanip>using namespace std;//#pragma comment(linker, "/STACK:102400000,102400000")#define maxn 100050#define MOD 1000000007#define p 1000000007#define mem(a , b) memset(a , b , sizeof(a))#define LL long long#define ULL unsigned long long#define FOR(i , n) for(int i = 1 ;  i<= n ; i ++)typedef pair<int , int> pii;const long long INF= 0x3fffffff;LL n,m;LL quick_mod(LL a, LL b){    LL ans = 1;    a %= p;    while(b)    {        if(b & 1)        {            ans = ans * a % p;            b--;        }        b >>= 1;        a = a * a % p;    }    return ans;}LL C(LL n, LL m){    if(m > n) return 0;    LL ans = 1;    for(int i=1; i<=m; i++)    {        LL a = (n + i - m) % p;        LL b = i % p;        ans = ans * (a * quick_mod(b, p-2) % p) % p;    }    return ans;}LL Lucas(LL n, LL m){    if(m == 0) return 1;    return C(n % p, m % p) * Lucas(n / p, m / p) % p;}int main(){    while(scanf("%I64d%I64d", &n, &m) != EOF)    {        if(n <= 1 || m <= 1)        {            printf("0\n");            continue;        }        //m -= 2;        n = n + m - 4;        m -= 2;        printf("%I64d\n", Lucas(n,m));    }    return 0;}


0 0
原创粉丝点击