• 快速幂+大数取模


    快速幂,其实就是求(a^b)% p,(其中a,b,p都比较大在int范围内)这类问题。

    首先要知道取余的公式:(a*b)%p=(a%p*b%p)%p。

    那么幂不就是乘机的累积吗,由此给出代码:

    int fast(int a,int b,int p)

    {   long long a1=a,t=1;

       while(b>0)    

       { if(b&1)          /如果幂b是奇数多乘一次,因为后边会除2变偶数,(7/2=3)

        t=(t%p)*(a1%p)%p;

        a1=(a1%p)*(a1%p)%p;  

        b/=2;    }

      return (int)(t%p);

    }

    顺便把大数取模也给出吧,它的原理就是这个取余公式:(a+b)%p=(a%p+b%p)%p;

    那么大数可以看做每一位的那位数字乘以自身的权然后每位相加。

    如:12345678=(1*10000000)+(2*1000000)+…+8。

    代码如下:

    char s[200];

    #define mod 10000010;

    int main()

    {   while(gets(s))

    {   int k=strlen(s),sum=0;

      for(int i=0;i<k;i++)

      sum=(sum*10+s[i]-'0')%mod;    /当然要是担心sum还可能溢出,那就对里边再拆开来取余

      cout<<sum<<endl;

    } }

    待续……

  • 相关阅读:
    SQL 开窗函数
    使用 git 管理源代码
    mybatis常见问题
    es-删除记录
    Jmeter使用
    websocket在服务端获取客户端IP
    单点登录
    java中的HTTP客户端
    SpringBoot利用Redis管理分布式Session
    springboot中的统一异常处理
  • 原文地址:https://www.cnblogs.com/llsq/p/5810262.html
Copyright © 2020-2023  润新知