2016百度之星资格赛 Problem A

来源:互联网 发布:通达信趋势浪指标源码 编辑:程序博客网 时间:2024/05/17 21:06

求从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;}


0 0
原创粉丝点击