最右边的数字
问题描述:

解决方案:
采用快速幂,减少相乘的次数,同时每次乘都模一次。
先来看快速幂在维基百科中的定义。在数学和程序设计中,平方求幂(英语:exponentiating by squaring)或快速幂是快速计算一个数(或更一般地说,一个半群的元素,如多项式或方阵)的大正整数幂的一般方法。
有个公式是这样的。

注意这个公式,不管n为奇数或者偶数,都有x^2,区别就在当n为奇数时,需单独乘x;同时需要关注一点,这个n是动态的。
直接用这个例题进行解释。(这里采用C++)
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 long long getAnswer(long long a,long long b,long long c){ //数值很大,所以采用long long数值类型 5 long long ans=1; 6 while(b){//这里的b相当于n,根据b的奇偶性,确定是否需要多乘a;c是模数,这里每乘一次,就模一次,确保不会超值。 7 if(b&1) ans = ans*a%c; 8 a = a*a%c; 9 b >>= 1; 10 } 11 return ans; 12 } 13 int main(){ 14 long long n,m; 15 int b; 16 long long ans=0; 17 cin>>n; 18 while(n--){ 19 cin>>m>>b; 20 ans = getAnswer(m,b,10); 21 cout<<ans<<endl; 22 } 23 return 0; 24 }
注:之所以可以采用每乘一次,都模一次,原因是最右位的数只有个位数的相乘有关,明白了这个原由,也就好理解了。其实若题目需要求最左位的数,这时候就需要换方法啦。

浙公网安备 33010602011771号