您的位置:首页 > 其它

fzu 2020 组合数对素数取模lucas定理

2015-04-14 17:11 459 查看


由于p是素数,计算逆元可以借助费马小定理,用扩展欧几里得也可以,不过预计比快速幂慢吧。

代码如下:

#include <iostream>
using namespace std;

typedef long long ll;

int pow_mod( int a, int n, int mod )
{
int ans = 1, w = a % mod;
while ( n )
{
if ( n & 1 )
{
ans = (ll) ans * w % mod;
}
w = (ll) w * w % mod;
n = n >> 1;
}
return ans;
}

int c( int n, int m, int p )
{
int ans = 1;
for ( int i = 1; i <= m; i++ )
{
int a = n - m + i, b = i;
a = a % p, b = b % p;
ans = (ll) ans * ( (ll) a * pow_mod( b, p - 2, p ) % p ) % p;
}
return ans;
}

int lucas( int n, int m, int p )
{
int ans = 1;
while ( n )
{
ans = (ll) ans * c( n % p, m % p, p ) % p;
n = n / p, m = m / p;
}
return ans;
}

int main ()
{
int t;
cin >> t;
while ( t-- )
{
int n, m, p;
cin >> n >> m >> p;
cout << lucas( n, m, p ) << endl;
}
return 0;
}


参考于:http://m.blog.csdn.net/blog/acdreamers_11109/8037918
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: