SP16211 Wilson定理题解
引入
求
如果直接暴力求
Wilson 定理
当
为什么呢?显然,在
因此,逆元不是自己本身的数,在模意义下不对
解题思路
对于
考虑到
而求
回头来看,我们利用了
CODE
#include <bits/stdc++.h>
#define int long long
using namespace std;
int t,n,p,x,y;
int exgcd(int l,int r)
{
if(r==0)
{
x=1;
y=0;
return l;
}
int d=exgcd(r,l%r);
int s=x;
x=y;
y=s-l/r*y;
return d;
}
int mod_slover(int a,int n,int b)
{
int g=exgcd(a,b);
if(n%g!=0) return 0;
x=(x*(n/g))%p;
x=(x%(b/g)+(b/g))%(b/g);
return x;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>t;
while(t)
{
t--;
cin>>n>>p;
if(n>=p)
{
cout<<0<<'\n';
continue;
}
int num=1;
for(int i=n+1;i<p;i++) num=num*i%p;
cout<<(p-1)*mod_slover(num,1,p)%p<<'\n'; //直接利用 Wilson 和乘法逆元求得 n!
}
return 0;
}