快速冪+大數取模


快速冪,其實就是求(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;

} }

待續……

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM