您的位置:首页 > 其它

Problem 2020 组合(FOJ)

2015-08-12 08:07 316 查看
Problem 2020 组合

Accept: 714 Submit: 1724
Time Limit: 1000 mSec Memory Limit : 32768 KB

#include <cstdio>
#include <iostream>
#include <sstream>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
#define ll long long
#define _cle(m, a) memset(m, a, sizeof(m))
#define repu(i, a, b) for(int i = a; i < b; i++)
#define repd(i, a, b) for(int i = b; i >= a; i--)
#define sfi(n) scanf("%d", &n)
#define sfl(n) scanf("%I64d", &n)
#define pfi(n) printf("%d\n", n)
#define pfl(n) printf("%I64d\n", n)
#define MAXN 1000005

ll quickpow(ll m, ll n , ll k){
ll   ans = 1;
while(n){
if(n & 1)//如果n是奇数
ans = (ans * m) % k;
n = n >> 1;//位运算“右移1类似除2”
m = (m * m) % k;
}
return ans;
}

//ll quickpow(ll a, ll b, ll p)
//{
//    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, ll p)
{
if(m > n) return 0;
ll ans = 1;
for(int i = 1; i <= m; i++)
{
ll a = (n - m + i) % p;
ll b = i % p;
ans = ans * (a * quickpow(b, p - 2, p) % p) % p;
}
return ans;
}

ll Lucas(ll n, ll m, ll p)
{
if(m == 0) return 1;
else
return (C(n % p, m % p, p) * Lucas(n / p, m / p, p)) % p;
}
int main()
{
int T;
sfi(T);
while(T--)
{
ll n, m, p;
sfl(n), sfl(m), sfl(p);
pfl(Lucas(n, m, p));
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: