随笔 - 150  文章 - 0 评论 - 3 阅读 - 34652
< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

题目描述

现有数阵如下:
求这个数阵的第n行m列是多少(行列标号从1开始)
结果对10007取模

 

输入

多组数据,每组数据一行,包含两个整数n,m(1<=n<=m<=10^18)

 

输出

每组数据输出一行,为数阵中第n行m列对10007取模后的值。

--正文

C(m,n) % p 

组合数取模问题

PS:找规律真是恶心

复制代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

typedef long long LL;
LL n,m;
LL p = 10007;

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

LL C(LL n,LL m){
    if (m > n) return 0;
    LL ans = 1;
    LL i;
    for (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("%lld %lld",&n,&m) != EOF){
        printf("%d\n",lucas(m,n));
    }
    return 0;
}
复制代码

 

posted on   Crutain  阅读(237)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示