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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

次方求模 http://acm.nyist.net/JudgeOnline/problem.php?pid=102

發布時間:2024/4/14 php 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 次方求模 http://acm.nyist.net/JudgeOnline/problem.php?pid=102 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

次方求模

時間限制:1000 ms ?|? 內存限制:65535 KB 難度:3 描述

求a的b次方對c取余的值

?

輸入
第一行輸入一個整數n表示測試數據的組數(n<100)
每組測試只有一行,其中有三個正整數a,b,c(1=<a,b,c<=1000000000)
輸出
輸出a的b次方對c取余之后的結果
樣例輸入
3 2 3 5 3 100 10 11 12345 12345
樣例輸出
3 1 10481
來源
[張云聰]原創
上傳者
張云聰
#include<stdio.h> long long fun(long long a,long long b,long long c) {long long r=a%c;long long k=1;while(b){if (b&1)k=(k*r)%c;r=(r*r)%c;b>>=1;}return k; } int main() {int n;scanf("%d",&n);while(n--){long a,b,c,count;scanf("%d %d %d",&a,&b,&c);count=fun(a,b,c);printf("%d\n",count);}return 0; }

看著代碼很簡單,可是背后蘊含了多少了汗水啊!看一下算法吧:其實就是a^29=a^14*a,而a^14=a^7*a^7,a^7=a^3*a^3,a^3=a^2*a,這樣求a^29就用了7次乘法,不知你有沒有發現,這和二分法查找很相似,每次規模都近視減少了一半。注意long long 的使用,否則就會溢出,得不到正確答案。

補充:

利用模運算的運算規則,我們可以使某些計算得到簡化。例如,我們想知道3333^5555的末位是什么。很明顯不可能直接把3333^5555的結果計算出來,那樣太大了。但我們想要確定的是3333^5555(%10),所以問題就簡化了。 根據運算規則(4)a^b% p = ((a % p)^b) % p ,我們知道3333^5555(%10)= 3^5555(%10)。由于3^4 = 81,所以3^4(%10)= 1。 根據運算規則(3) (a * b) % p = (a % p * b % p) % p ,由于5555 = 4 * 1388 + 3,我們得到3^5555(%10)=(3^(4*1388) * 3^3)(%10)=((3^(4*1388)(%10)* 3^3(%10))(%10) =(1 * 7)(%10)= 7。 計算完畢。 利用這些規則我們可以有效地計算X^N(% P)。簡單的算法是將result初始化為1,然后重復將result乘以X,每次乘法之后應用%運算符(這樣使得result的值變小,以免溢出),執行N次相乘后,result就是我們要找的答案。 這樣對于較小的N值來說,實現是合理的,但是當N的值很大時,需要計算很長時間,是不切實際的。下面的結論可以得到一種更好的算法。 如果N是偶數,那么X^N =(X*X)^[N/2]; 如果N是奇數,那么X^N = X*X^(N-1) = X *(X*X)^[N/2]; 其中[N]是指小于或等于N的最大整數。 C++實現功能函數: ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /* 函數功能:利用模運算規則,采用遞歸方式,計算X^N(% P) 函數名:PowerMod 輸入值:unsigned int x,底數x unsigned int n,指數n unsigned int p,模p 返回值:unsigned int,X^N(% P)的結果 */ unsigned PowerMod(unsigned x , unsigned n , unsigned p) { ??? if (!n) ???? ???return 0; ??? unsigned temp = PowerMod((x * x) % p , n >> 1 , p); //遞歸計算(X*X)^[N/2] ??? if (n & 1) //判斷n的奇偶性 ???? ???temp = (temp * x) % p; ??? return temp; }

轉載于:https://www.cnblogs.com/wangyouxuan/p/3270614.html

總結

以上是生活随笔為你收集整理的次方求模 http://acm.nyist.net/JudgeOnline/problem.php?pid=102的全部內容,希望文章能夠幫你解決所遇到的問題。

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