XDU-1032 找规律II (Lucas定理)

1032: 找规律II

时间限制: 1 Sec  内存限制: 128 MB

http://acm.xidian.edu.cn/problem.php?id=1032

[提交][状态][讨论版]

题目描述

现有数阵如下:

求这个数阵的第n行m列是多少(行列标号从1开始)

结果对10007取模

输入

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

输出

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

样例输入

1 1
1 2
1 3

样例输出

1
2
3

很容易就能看出是结果组合数,所以直接套用Lucas模版即可

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;

const LL MOD=10007;

LL n,m;

LL quick_pow(LL a, LL b) {
    LL ans = 1;
    a %= MOD;//防止指数为0时,返回未取模的结果
    while(b!=0) {
        if((b & 1)==1) {
            ans = ans * a % MOD;
        }
        b >>= 1;
        a = a * a % MOD;
    }
    return ans;
}

LL C(LL n, LL m) {
    if(n < m) {
        return 0;
    }
    if(n == m) {
        return 1;
    }
    if(m > n - m) {//利用组合数性质,减少运算次数
        m=n - m;
    }
    LL ans, a = 1, b = 1;
    for(int i=0; i<m; ++i) {
        a = (a * (n - i)) % MOD;
        b = (b * (m - i)) % MOD;
    }
    ans = (a * quick_pow(b, MOD-2)) % MOD;
    return ans;
}

LL Lucas(LL n, LL m) {
    LL ans=1;
    while(m>0) {
        ans=(ans*C(n % MOD, m % MOD)) % MOD;
        n/=MOD;
        m/=MOD;
    }
    return ans;
}

int main() {
    LL n,m;
    while(2==scanf("%lld%lld",&n,&m)) {
        printf("%lld\n",Lucas(m,m-n));
    }
    return 0;
}
时间: 2024-10-13 21:57:20

XDU-1032 找规律II (Lucas定理)的相关文章

XidianOJ 1032 找规律Ⅱ

题目描述 现有数阵如下: 求这个数阵的第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 <

ZOJ3557 How Many Sets II( Lucas定理)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud How Many Sets II Time Limit: 2 Seconds      Memory Limit: 65536 KB Given a set S = {1, 2, ..., n}, number m and p, your job is to count how many set T satisfies the following condition: T is

ZOJ 3557-How Many Sets II(Lucas定理+插板法求组合数)

题目地址:ZOJ 3557 题意:给一个集合,一共n个元素,从中选取m个元素,满足选出的元素中没有相邻的元素,一共有多少种选法(结果对p取模1 <= p <= 10^9) 思路:用插板法求出组合数.既然是从n个数中选择m个数,那么剩下的数为n-m,那么可以产生n-m+1个空,这道题就变成了把m个数插到这n-m+1个空中有多少种方法,即C(n-m+1,m)%p.然后就Lucas定理上去乱搞.因为这道题的p较大,所以不能预处理. #include <stdio.h> #include

ZOJ 3557 How Many Sets II lucas 定理

插空法 大组合数取余 #include <cstdio> #include <cstring> using namespace std; typedef long long LL; //求整数x和y,使得ax+by=d, 且|x|+|y|最小.其中d=gcd(a,b) void gcd(LL a, LL b, LL& d, LL& x, LL& y) { if(!b) { d = a; x = 1; y = 0; } else { gcd(b, a%b, d

西电校赛网络赛J题 lucas定理计算组合数

西电校赛网络赛J题  lucas定理计算组合数 问题 J: 找规律II 时间限制: 1 Sec  内存限制: 128 MB 提交: 96  解决: 16 [提交][状态][讨论版] 题目描述 现有数阵如下: 1    2  3   4     5    6 1   3   6  10  15 1   4  10   20 1   5   15 1    6 1 求这个数阵的第n行m列是多少(行列标号从1开始) 结果对10007取模 输入 多组数据,每组数据一行,包含两个整数n,m(1<=n<=

数论(Lucas定理) HDOJ 4349 Xiao Ming&#39;s Hope

题目传送门 题意:求C (n,0),C (n,1),C (n,2)...C (n,n)中奇数的个数 分析:Lucas 定理:A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0].则组合数C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0])  mod p同.即:Lucas (n,m,p)=C (n%p,m%p) * Lucas (n/p,m/p,p)  我是打表找规律的,就是

HDU 1165 Eddy&#39;s research II(给出递归公式,然后找规律)

- Eddy's research II Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description As is known, Ackermann function plays an important role in the sphere of theoretical computer science. However, in the other h

HDU 4349 组合数的奇数个数-杨辉三角&amp;Lucas定理

题意:给你一个n,求C (n,0),C (n,1),C (n,2)...C (n,n),奇数的个数. 分析: Lucas定理: A.B是非负整数,p是质数.AB写成p进制:A=a[n]a[n-1]...a[0],B=b[n]b[n-1]...b[0]. 则组合数C(A,B)与C(a[n],b[n])*C(a[n-1],b[n-1])*...*C(a[0],b[0])  modp同余 即:Lucas(n,m,p)=c(n%p,m%p)*Lucas(n/p,m/p,p) 来看这一题,求奇数,那么我们

[Swust OJ 666]--初来乍到(题号都这么溜~~,递归,找规律)

题目链接:http://acm.swust.edu.cn/problem/0666/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 小李去埃及旅游,但是初来乍到的他不认识罗马数,所以请你将阿拉伯数n ( 0 < n <= 1000)改写为罗马数. Input N行数据,每行一个满足0 < n <= 1000的数: 结束以EOF判断 Output 每行一个,见输出示例 Sample Input 1 10 35 99