Ps:费马小定理解决(也可以用扩展欧几里得算法)
逆元 :(a/b) (mod N) = (a * x) (mod N)。 x表示b的逆元。并且 b*x ≡ 1 (mod N ) 注意:只有当b与N互质的时候才存在逆元。一般情况下,ax+by=1;得 x为a mod b 的逆元,y为 b mod a的逆元。
根据费马小定理,对于素数n,任意不是n的倍数的b,都有: b^(N-1)=1(mod N)
于是可以拆成: b*b^(N-2)=1(mod N) --------> a/b=a/b*(b*b^(N-2))=a*(b^(n-2))(mod N)
也就是我们要求的逆元为b^(N-2)(mod N)
#include<iostream>
#include<stdio.h>
#define LL long long
#define mo 9973
using namespace std;
LL qmod(LL a,LL b)
{
LL sum=1;
while(b)
{
if(b&1) sum=(sum*a)%mo;
b>>=1;
a=(a*a)%mo;
}
return sum;
}
int main()
{
int n,i,a,b;
string str;
LL s[100005];
while(scanf("%d",&n)!=EOF)
{
cin>>str;
s[0]=1;
for(long i=1;i<=str.length();i++)
s[i]=(s[i-1])*(str[i-1]-28)% mo;
for(int i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
if(a>b) swap(a,b);
printf("%ld\n",(s[b]*(qmod(s[a-1],mo-2)%mo))%mo);
}
}
return 0;
}
本文介绍了一种利用费马小定理计算乘法逆元的方法,并通过一个模板题展示了如何求解特定模意义下的逆元。文章还提供了一段C++代码示例,用于解释算法的具体实现。
1419

被折叠的 条评论
为什么被折叠?



