// 线性求组合数逆元
#include <iostream>
#include <cstring>
using namespace std;
const int pi = 17;
int f[10000];
int inv[10000];
void Init() //线性求逆元
{
f[0]=f[1] = 1;
inv[1] = 1;
for(int i =2;i<10000;i++)
{
f[i] = f[i-1]*i%pi;
inv[i] = (pi-pi/i)*inv[pi%i]%pi;
}
return;
}
//扩展欧几里得求逆元
void exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x= 1,y =0;
return ;
}
exgcd(b,a%b,x,y);
int t = y;
y = x - (a/b)*y;
x = t;
return ;
}
int main()
{
Init();
for(int i = 2;i<=16;i++)
{ printf("线性求逆元结果\n");
cout<<f[i]*inv[f[i]]%pi<<endl;
printf("exgcd结果\n");
int x ,y;
exgcd(f[i],pi,x,y);
x = (x%pi+pi)%pi; //这一步是确保相乘结果为1
cout<<(f[i]*x)%pi<<endl;
}
return 0;
}
组合数逆元求法
最新推荐文章于 2024-05-21 21:17:02 发布