本文主要是介绍末两位数(1992)_题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【题解提供者】吴立强
解法
思路
指数函数增长速率过快,直接计算中间过程任何一种基本类型都无法存储。
通过乘法运算的规律,可以发现末两位数只和末两位数相关,故直接对中间结果保留末两位数(mod 100)即可避免乘法溢出。
代码
#include <iostream>
using namespace std;const int mod = 100;int main() {int n; cin >> n;int ans = 1;while(n --) ans = (ans * 92) % mod;cout << ans;return 0;
}
算法分析
本算法的时间复杂度为 O ( n ) O(n) O(n)。
拓展
实际上对于任意的 ( a × b ) m o d p (a\times b)\mod p (a×b)modp 的求解都可以转化为: ( ( a m o d p ) × ( b m o d p ) ) m o d p ((a\mod p)\times (b\mod p))\mod p ((amodp)×(bmodp))modp。
a a a 可以看做是 a = k 1 × p + ( a m o d p ) a = k_1\times p + (a\mod p) a=k1×p+(amodp)。
b b b 可以看做是 b = k 2 × p + ( b m o d p ) b = k_2\times p + (b \mod p) b=k2×p+(bmodp)。
那么有:
( a × b ) m o d p (a\times b)\mod p (a×b)modp
= ( ( k 1 × p + ( a m o d p ) ) × ( k 2 × p + ( b m o d p ) ) ) m o d p =((k_1\times p + (a\mod p)) \times (k_2\times p + (b \mod p)))\mod p =((k1×p+(amodp))×(k2×p+(bmodp)))modp
= ( ( k 1 × k 2 + k 1 × ( b m o d p ) + k 2 × ( a m o d p ) ) × p + ( a m o d p ) × ( b m o d p ) ) m o d p =((k_1\times k_2+ k_1\times(b\mod p)+ k_2\times(a \mod p))\times p + (a\mod p)\times (b\mod p))\mod p =((k1×k2+k1×(bmodp)+k2×(amodp))×p+(amodp)×(bmodp))modp
= ( ( a m o d p ) × ( b m o d p ) ) m o d p =((a\mod p)\times (b\mod p))\mod p =((amodp)×(bmodp))modp。
这篇关于末两位数(1992)_题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!