日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

快速幂取模算法

發布時間:2025/3/16 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速幂取模算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

因為進位對個位不影響,積的取余等于取余的積取余

#include<stdio.h>int PowerMod(int a, int b, int c) {int ans = 1;int k = a % c;while(b>0)//(k*k % c)2^b %c{if(b % 2 == 1)//如果是奇數ans = (ans * k) % c;b = b/2;k = (k * k) % c;//k是不斷代入,以代表每一次降一次冪} return ans;}int main() {int T;scanf("%d",&T);while(T--){int n;scanf("%d",&n);int ans=PowerMod(n,n,10);printf("%d\n",ans);}return 0; }

1.如果b是偶數,我們可以記k = a2?mod c,那么求(k)b/2?mod c就可以了。

2.如果b是奇數,我們也可以記k = a2?mod c,那么求

((k)b/2?mod c?×?a ) mod c =((k)b/2?mod c * a) mod c?就可以了。

?

那么我們可以得到以下算法:

算法4

int?ans = 1;

a = a % c;

if(b%2==1)

ans = (ans * a) mod c;?//如果是奇數,要多求一步,可以提前算到ans

k = (a*a) % c;?//我們取a2而不是a

for(int?i = 1;i<=b/2;i++)

{

ans = (ans * k) % c;

}

ans = ans % c;

?

我們可以看到,我們把時間復雜度變成了O(b/2).當然,這樣子治標不治本。但我們可以看到,當我們令k = (a * a) mod c時,狀態已經發生了變化,我們所要求的最終結果即為(k)b/2?mod c而不是原來的ab?mod c所以我們發現這個過程是可以迭代下去的。當然,對于奇數的情形會多出一項a mod c,所以為了完成迭代,當b是奇數時,我們通過

ans = (ans * a) % c;來彌補多出來的這一項,此時剩余的部分就可以進行迭代了。

?

形如上式的迭代下去后,當b=0時,所有的因子都已經相乘,算法結束。于是便可以在Olog b的時間內完成了。于是,有了最終的算法:快速冪算法。

算法5:快速冪算法

?

int?ans = 1;

a = a % c;

while(b>0)

{

?

if(b % 2 == 1)

ans = (ans * a) % c;

b = b/2;

a = (a * a) % c;

}

將上述的代碼結構化,也就是寫成函數:

int?PowerMod(int?a,?int?b,?int?c)

{

int?ans = 1;

a = a % c;

while(b>0)

{

?

if(b % 2 = = 1)

ans = (ans * a) % c;

b = b/2;

a = (a * a) % c;

}

return?ans;

}

本算法的時間復雜度為Ologb),能在幾乎所有的程序設計(競賽)過程中通過,是目前最常用的算法之一。



總結

以上是生活随笔為你收集整理的快速幂取模算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。