最右边的数字

问题描述:

 

 解决方案:

采用快速幂,减少相乘的次数,同时每次乘都模一次。

先来看快速幂在维基百科中的定义。在数学程序设计中,平方求(英语: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 }

 

注:之所以可以采用每乘一次,都模一次,原因是最右位的数只有个位数的相乘有关,明白了这个原由,也就好理解了。其实若题目需要求最左位的数,这时候就需要换方法啦。

 

posted @ 2020-08-03 11:24  Anthony7  阅读(245)  评论(0)    收藏  举报