杭电1061 Rightmost Digit
2017-10-01 12:53
232 查看
这一题一开始我想的挺简单的。一看题目直接动手写了。然后就写了下面的代码
VS中运行基本没有任何问题,以为这一题就这么简单的结束了。放进去一运行出现了Time Limit Exceeded。发现自己还是错了。然后再网上看看大神怎么做。最后发现这一题原来是要用 模幂运算。然后查看了取模运算的性质。
(a * b) % p = (a % p * b % p) % p
这个运算。这样不就可以进行递归运算了。
最后发现还是Time Limit Exceeded。也不知道啥情况。最后只能弄非递归的方法写一写
最后就运行成功了。这一题还是有一些小弯路的。
#include <iostream> using namespace std; int main() { int m; cin >> m; while (m) { int n,re=1; cin >> n; for (int i = 0; i < n;i++) { re *= n; } cout << re%10 << endl; } return 0; }
VS中运行基本没有任何问题,以为这一题就这么简单的结束了。放进去一运行出现了Time Limit Exceeded。发现自己还是错了。然后再网上看看大神怎么做。最后发现这一题原来是要用 模幂运算。然后查看了取模运算的性质。
(a * b) % p = (a % p * b % p) % p
这个运算。这样不就可以进行递归运算了。
#include<iostream> using namespace std; /* int fun(int a, int b, int c) { if (b == 0) { return 1; } else { if (b%2==0) { return fun(a, b / 2, c)*fun(a, b / 2, c) % c; } else { return a*fun(a, b - 1, c) % c; } } } int main() { int m, n; cin >> m; while (m) { cin >> n; cout << fun(n, n, 10) << endl; m--; } return 0; }*/
最后发现还是Time Limit Exceeded。也不知道啥情况。最后只能弄非递归的方法写一写
#include <iostream> using namespace std; int fun(int a, int b, int c) { int res = 1; a = a%c; while (b) { if (b & 1) { res = res*a%c; --b; } else { a = a*a%c; b =b/2; } } return res; } int main() { int m, n; cin >> m; while (m) { cin >> n; cout << fun(n,n,10) << endl; m--; } return 0; }
最后就运行成功了。这一题还是有一些小弯路的。
相关文章推荐
- 【杭电oj】1061 - Rightmost Digit(打表)
- 杭电 1061 Rightmost Digit计算N^N次方的最后一位
- 杭电--1061 Rightmost Digit
- 杭电OJ1061-Rightmost Digit
- 杭电 HDU 1061 Rightmost Digit
- 【杭电 1061】 Rightmost Digit
- Rightmost Digit(杭电1061)(求N^N的最低位)
- 杭电1061 Rightmost Digit
- 【HDU 杭电 1061】 Rightmost Digit
- 【杭电】[1061]Rightmost Digit
- 杭电 HDU ACM 1061 Rightmost Digit
- 【杭电1061】Rightmost Digit
- 杭电1061 Rightmost Digit
- hdoj-【1061 Rightmost Digit】
- HDU 1061 Rightmost Digit
- HDU 1061 Rightmost Digit(分类讨论)
- HDU 1061 Rightmost Digit
- 1061:Rightmost Digit(代码超级简洁)
- 【快速幂取模】HDU 1061---Rightmost Digit
- HDU 1061 Rightmost Digit