题目描述
众所周知,a^b表示a的b次幂。例如:2^3=2*2*2=8。
一天,某只肥皂很无聊,于是在纸上写了形如a^b的式子玩。FL见到了,过来一起玩。突然,FL脑洞一开:我给你普及一个符号“^^”,叫做超级幂。a^^b表示a^(a^(a^(a^a^(…)))),共b个a。例如2^^3=2^(2^2)=2^4=16。那么你知道a^^b的个位数是多少么?
肥皂表示一脸懵逼,于是一旁看热闹的YDL出现了,随手写了一个式子:(a1^^b1)(a2^^b2)(a3^^b3)……..(an^^bn),保证ai的个位数不等于2或4或8。说,请求出这个式子的个位数。
肥皂和FL两脸懵逼。现在FL只好想你求助了。
注意:a^^0=1,表示有0个a, 例如: 3^^0=1
Analysis
这题是教练叫我们出题,本蒟蒻出的一道题,竟然用来给小学生考试了。
题目中的肥皂就是lzh,FL就是howarLi,当然YDL就是我。
其实就是一道大水题啦,本人实力有限,只出了这么一题。
题解如下:
我们可以分类讨论(好像也可以找规律)。
对于各组数据之间是独立的,所以我们先只考虑(ai^^bi) mod 10
因为题目只要求输出个位,所以可以让
ci=ai mod 10.
然后有
0<=ci<=9,ci
是整数。
若
ci=1
,则不管它套上多少个幂,其个位数永远是
1
(显然)。
同理,当
因为题目限制了
当
ci=3
或
7
时:
因为
所以
ci
的指数
aiaiai...(bi−1个ai)
就相当于其
mod 4
后的结果。
以
ci=3
为例。不论如何,易证
ai≡1
或
−1(mod 4)
若
ai≡1(mod 4)
,则原式变成了ci^1^1^1^1^1…..=ci,个位数就是
ci
。
否则
ai≡−1(mod 4)
,则原式变成了ci^(-1)^(-1)^(-1)….=ci^(-1)=ci^3,个位数易求。
当
ci=9
时
92≡1(mod 10)
,同样的方法处理即可。
其实这道题的
bi
并没有实际性的用处,只是用来吓人的。
Code
#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int N=100010;
int main()
{
freopen("superpow.in","r",stdin);
freopen("superpow.out","w",stdout);
int T,n,x,y;
scanf("%d",&T);
while(T--)
{
int ans=1;
scanf("%d",&n);
fo(i,1,n)
{
scanf("%d %d",&x,&y);
int z=x%10;
if(y==0) continue;
if(y==1)
{
ans=ans*z%10;
continue;
}
if(z==0 || z==1 || z==5 || z==6 || z==9)
{
ans=ans*z%10;
continue;
}
if(z==3 || z==7)
{
if(x%4==1) ans=ans*z%10;
else ans=ans*(z*z*z%10)%10;
continue;
}
}
printf("%d\n",ans);
}
fclose(stdin);fclose(stdout);
return 0;
}