(3^n + 2^n) % 10 for large n

(3^n + 2^n) % 10 for large n

本文关键字:for large      更新时间:2023-10-16

,所以我有一个最多9位数字的数字,我必须获得3^n 2^n的最后一个数字。是否有这种问题的规则?我到目前为止的代码:

#include <fstream>
#include <algorithm>
#include <math.h>
using namespace std;
ifstream fin("input.in");
ofstream fout("input.out");
int main(){
int n;
fin>>n;
fout<<fmod(pow(3,n)+pow(2,n),10);
}

但是,如果我使用它,并且n大于1000,则显示nan。

我的问题是:是否有这样的问题?

好吧,我们知道(3^n + 2^n) % 10 = ((3^n % 10) + (2^n % 10)) % 10,因此我们可以使用模块化指数快速解决此问题。

基本前提是3^n % 10 = (3 * (3^(n-1) % 10)) % 10

好吧,最简单的答案是:

3^0 === 1;
3^1 === 3;
3^2 === 9;
3^3 === 7;
3^4 === 1;
3^5 === 3;

so,3^n的最后一个数字为3、9、7或1,基于n。n%4 == 0 => 3^n的最后一个数是1,== 1 => 3,== 2 => 9,== 3 =>7。

您可以写出2^n:

的书写

1, 2,4,8,6 ,2,...

可以一直重复此周期,排除主要规则:2^n的最后一位数字是:

N == 0 => 1
N > 0 => 
    (N - 1) % 4 == 0 => 2
    (N - 1) % 4 == 1 => 4
    (N - 1) % 4 == 2 => 8
    (N - 1) % 4 == 3 => 6

在计算了3^n和2^n的最后一个数字之后,只需将它们添加在一起。

您可以数学上解决它。让我们看一下序列u n = 3^n%10:u 0 = 1,然后再次3、9、7和1。它立即给出:

u 4K = 1,U 4K 1 = 3,u 4K 2 = 9,U 4K 3 = 7

现在查看V n = 2 n %10:v 0 = 1,然后2,4,8,6,然后2再次。它给出了k> 0:

v 4K = 6,V 4K 1 = 2,V 4K 2 = 4,V 4K 3 = 8

您立即获得结果:对于n> 1,只需查看n'= n%4,结果分别为7、5、3、5

在C 中,它将给出:

#include <fstream>
using namespace std;
ifstream fin("input.in");
ofstream fout("input.out");
int main(){
    int n;
    fin>>n;
    int result[] = { 7,5,3,5};
    fout<<(n == 0) ? 2 : result[n%4];
    return 0;
}