首页 > 其他 > 详细

HDU 5226

时间:2015-05-22 23:57:20      阅读:415      评论:0      收藏:0      [点我收藏+]

公式啊,公式啊。。。。TAT

技术分享

杭电题解。。。。。高中生。。。。。。

对于卢卡斯定理,由于p较大,所以不可能按一般的来算,n,m较小,循处理出n!的逆元对p的,然后可以按照卢卡斯定理,降低,对后面的就可以直接运用组合数公式来求了。

#include<cstdio>
#include<cmath>
#include<queue>
#include<map>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 100005;
long long a[maxn], b[maxn], X1, X2, Y1, Y2, P, ans;
int n;

long long inv(long long x, long long m)
{
    if (x == 1) return x;
    return inv(m % x, m)*(m - m / x) % m;
}

long long C(int x, int y)
{
    if (x > y) return 0;
    return (a[y] * b[x]) % P * b[y - x] % P;
}

long long c(int x, int y)
{
    if (x > y) return 0;
    if (y >= P) return C(x % P, y % P)*c(x / P, y / P) % P;
    else return C(x, y);
}

int main()
{
    while (cin >> X1 >> Y1 >> X2 >> Y2 >> P)
    {
        a[0] = b[0] = 1;
        for (int i = 1; i <= min(X2 + 1, P - 1); i++)
        {
            a[i] = (a[i - 1] * i) % P;
            b[i] = inv(a[i], P);
        }
        ans = 0;
        for (int i = Y1; i <= Y2; i++)
        {
            (ans += c(i + 1, X2 + 1) - c(i + 1, X1)) %= P;
        }
        (ans += P) %= P;
        cout << ans << endl;
    }
    return 0;
}

  

 

HDU 5226

原文:http://www.cnblogs.com/jie-dcai/p/4523467.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!