高精度問題
Time Limit:1000MS Memory Limit:65536K
Total Submit:381 Accepted:107
Description
相信經(jīng)過暑假一個月的培訓(xùn),大家應(yīng)該已經(jīng)掌握了高精度的算法了。但是往往比賽中涉及到高精度的問題并不多。而有些題目可能看起來需要高精度,而實(shí)際上并不需要。一個很好的例子就是3^p mod x, 初學(xué)者如果不知道同余的概念的話,可能會求出3^p先,然后再對x取余,然而這對p很大的時候是行不通的。。于是我們想到了邊乘邊取余,其基本的思想就是先把x的整數(shù)倍拿掉,因?yàn)樗麑ψ詈蟮挠嬎憬Y(jié)果沒有影響,但是這種算法對于p超過1000000的時候就會顯得很慢了,你有沒有想到更好的辦法。
本題的任務(wù)就是給你一個p和x輸出3^p mod x
Input
每行一個數(shù)據(jù) p和x,2 < p, x ≤ 1000000000, 輸入最后以0 0結(jié)束
Output
輸出3^p mod x
Sample Input
10 7
0 0
Sample Output
4
這個題目老師教了我好幾遍我也沒懂。。。悲劇!!!
代碼如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int modExp(int a, int b, int n)


{
__int64 t, y;
t=1;y=a;
while(b!=0)

{
if(b%2==1)

{
t=t*y%n;
}
y=y*y%n;
b=b/2;
}
return t;
}


int main()


{
int b,n;
while(scanf("%d %d",&b,&n)!=EOF&&(b!=0&&n!=0))

{
printf("%d\n",modExp(3,b,n));
}
return 0;
}

posted on 2010-09-19 14:21
jince 閱讀(205)
評論(0) 編輯 收藏 引用