求从ai乘到aj的值mod 9973和从a1乘到aj 除以从a1乘到a(i-1)mod 9973效果是一样的
由于数太大每次乘ai都要mod 9973 要使用上面的方法就要用到乘法逆元;
我用的这个是费马小定理推出的乘法逆元,费马小定理就问度娘吧,超详解,费马小定理最容易看懂了。
最近学了数论好多东西,有点乱,我就不解释费马小定理了,写完这篇文章捋一捋思路
我直接用strlen(s)竟然超时了,,,可怕
#include<iostream>
#include<math.h>
#include<cstdio>
#include<cstring>
using namespace std;
const int mod = 9973;
char s[100000+10];
int num[100000+10];
int p[100000+10];
int res[10000];
int ni(int a,int b)
{
int x=1;
while(b)
{
if(b&1)x=a*x%mod;
b>>=1;
a=a*a%mod;
}
return x;
}
int main()
{
int t;
for(int i=1;i<mod;i++)res[i]=ni(i,mod-2);
while(~scanf("%d%*c",&t))
{
scanf("%s",s);
int m,n,len;
len=strlen(s);
// memset(num,0,sizeof(num));
// memset(p,0,sizeof(p));
num[0]=1;
p[0]=1;
for(int i=1;i<=len;i++)
{
num[i]=num[i-1]*(int)(s[i-1]-28)%mod;
p[i]=res[num[i]];
}
while(t--)
{
scanf("%d%d",&m,&n);
printf("%d\n",num[n]*p[m-1]%mod);
}
}
return 0;
}