您的位置:首页 > 移动开发

NBUT-[1674] math happy

2017-05-15 20:51 78 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  acm 数论 快速幂 NBUT