NBUT-[1674] math happy

                                NBUT-[1674] math happy
                        时间限制: 1000 ms 内存限制: 65535 K
  • 问题描述

    计算1^1+2^2+3^3…….+n^n的和的个位数

  • 输入

    输入整数 T (T个case)
    输入整型 n (n < 10^18)
    
  • 输出

    输出算式的答案的个位数
    
  • 样例输入

    3
    1
    2
    3
    
  • 样例输出

    1
    5
    2
    

ac 代码:

/*
    题意: 计算1^1+2^2+3^3.......+n^n的和的个位数 注意 n 的范围 为1e18 :需要用LL 输入。
    思路: 首先想到的是快速幂。快速幂在求单个幂时特别快。但本题数据大,暴力将n个数的幂模加起来肯定tlx。
            想到打表 发现1^1, .... , n^n 在每20个有个循环。
            table[] 记录。
            然后想直接用(long long)sum 记录每一次的值,但是还超了;
            于是想到 每个数的和是否也有循环节。于是发现每200个就要循环一次。
            ans[x] 记录每个x 的 table[1%20]+...+table[x%20];
            输出直接打表就好。
*/
#include<iostream>
using namespace std;
typedef long long LL;

int table[21];
int ans[201];

LL fast_mi(LL a,LL b,int mod)
{
    LL base = a,re=1;
    while(b)
    {
        if(b&1) re=(re*base)%mod;
        base=(base*base)%mod;
        b>>=1;
    }
    return re;
}
int main()
{
    //打表。
    for(int i=1;i<=20;i++)
        table[i]=fast_mi(i,i,10);
    table[0]=table[20];
    int sum=0;
    for(int i=1;i<=200;i++)
    {
        sum+=table[i%20];
        ans[i]=sum%10;
    }
    ans[0]=ans[200];

    //main
    int t;
    cin>>t;
    while(t--)
    {
        LL num;
        cin>>num;
        cout<<ans[num%200]<<endl;;
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值