减小模运算时间复杂度的小技巧

  昨天兄弟问我一个模运算的题,怎么写怎么超时,要么WA,两个菜鸟讨论了半天也没讨论出个所以然来。后天问了别人,感觉这种写法很实用啊,就先存在这里。

  题目是SDUST OJ上的,题目如下:

Problem U: 开心的小杰

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 135   Solved: 25
[ Submit][ Status][ Web Board]

Description

小杰这次被某外语专业录取了,他发现班里n个MM,小杰从来没有见过这么多MM,假设小杰的人品值为rp,桃花运指数为m,则小杰最多可以追到(rp^m)%n个MM(^为乘方符号,例如a^b为a的b次方,%为取余符号,例如a%b为a除b的余数)。

 

Input

有多组输入数据,每组输入数据3个整数rp,m,n(0<n<2^31,0<rp<2^31,0<m<2^31).

 

Output

每个数据输出一行,一个整数代表小杰最多可以追到多少个MM。

 

Sample Input

1 1 2 2 4 100

Sample Output

1 16
 
 
 
代码如下
 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     long long rp,m,n;
 8     while(cin >> rp >> m >> n)
 9     {
10         rp %= n;
11         long long ans = 1;
12         for (int i=0;i<m/1024;i++)
13         {
14             ans = ans * rp % n;
15         }
16         for (int i=0;i<10;i++)//这个10与上面的1024的关系为 2^10 == 1024;换成256与8也能过,这是时间会慢很多;
17         {
18             ans = ans * ans % n;
19         }
20         for (int i=0;i<m%1024;i++)
21         {
22             ans = ans * rp % n;
23         }
24         cout << ans << endl;
25     }
26 }

 

 

转载于:https://www.cnblogs.com/zmx354/archive/2013/05/20/3088171.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值