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;
}