解析:分析题意不难发现无论k等于多少,n每经过一百个数前s个数的结果会经历一个循环。
以f(n,3)为例,
当1<=n<=100时,f(n,3)的结果为
1 9 6 0 5 1 4 6 5 5 6 4 1 5 0 6 9 1 0 0 1 9 6 0 5 1 4 6 5 5 6 4 1 5 0 6 9 1 0 0 1 9 6 0 5 1 4 6 5 5
6 4 1 5 0 6 9 1 0 0 1 9 6 0 5 1 4 6 5 5 6 4 1 5 0 6 9 1 0 0 1 9 6 0 5 1 4 6 5 5 6 4 1 5 0 6 9 1 0 0
当101<=n<=200时,f(n,3)的结果为
1 9 6 0 5 1 4 6 5 5 6 4 1 5 0 6 9 1 0 0 1 9 6 0 5 1 4 6 5 5 6 4 1 5 0 6 9 1 0 0 1 9 6 0 5 1 4 6 5 5
6 4 1 5 0 6 9 1 0 0 1 9 6 0 5 1 4 6 5 5 6 4 1 5 0 6 9 1 0 0 1 9 6 0 5 1 4 6 5 5 6 4 1 5 0 6 9 1 0 0
以此类推
我们会发现n每经历一百个数,结果会循环一次,所以我们只要求出前一百个数的结果并存入一个数组a【100】就好,再对t = n mod 100 ,a【t】即为结果,这样就会大大提高时间效率,避免由于n的值过大而造成的时间超时的情况。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
const int MAX = 1E5+10;
typedef long long ll;
using namespace std;
ll mod_pow(ll x,ll n,ll mod){
ll res=1;
while(n>0){
if(n&1) res=res*x%mod;
x=x*x%mod;
n>>=1;
}
return res;
} //快速幂
ll a[110];
int main()
{
int t;
cin>>t;
while(t--)
{
ll ans=0,n,k;
cin>>n>>k;
for(ll i=1;i<=100;i++)
{
ans+=mod_pow(i,k,10); //利用快速幂求出i^k的最后一位数并加到ans中
ans%=10; //保证ans为前i^k的和的最后一位数
a[i]=ans; //将ans存入数组a[]中
}
n=n%100;
cout<<a[n]<<endl;
}
return 0;
}