题目描述
众所周知, a b a^b ab表示a的b次幂。例如: 2 3 2^3 23= 2 ∗ 2 ∗ 2 2*2*2 2∗2∗2= 8 8 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
输入
第一行一个T,表示有T组数据。
接下来
T
∗
2
T*2
T∗2行。
第
j
∗
2
j*2
j∗2行一个整数
n
n
n。
第
j
∗
2
+
1
j*2+1
j∗2+1行,n对整数
a
i
a_i
ai,
b
i
b_i
bi,用空格隔开。
输出
输出共 T T T行。
对于每个T,输出一个整数,表示a1^^b1*a2^^b2*a3^^b3........an^^bn的个位数是多少。
数据范围限制
对于10%的数据,满足
T
=
1
,
1
<
=
n
,
a
i
<
=
5
,
0
<
=
b
i
<
=
3
T=1,1<=n,a_i<=5,0<=b_i<=3
T=1,1<=n,ai<=5,0<=bi<=3。
对于30%的数据,满足
1
<
=
T
<
=
5
,
1
<
=
n
,
a
i
<
=
100
,
0
<
=
b
i
<
=
5
1<=T<=5,1<=n,a_i<=100,0<=b_i<=5
1<=T<=5,1<=n,ai<=100,0<=bi<=5。
对于50%的数据,满足
1
<
=
T
<
=
20
,
1
<
=
n
,
a
i
<
=
5000
,
0
<
=
b
i
<
=
5000
1<=T<=20,1<=n,a_i<=5000,0<=b_i<=5000
1<=T<=20,1<=n,ai<=5000,0<=bi<=5000
对于100%的数据,满足
1
<
=
T
<
=
100
,
1
<
=
n
<
=
5000
,
1
<
=
a
i
<
=
50000
,
0
<
=
b
i
<
=
1
0
8
1<=T<=100,1<=n<=5000,1<=a_i<=50000,0<=b_i<=10^8
1<=T<=100,1<=n<=5000,1<=ai<=50000,0<=bi<=108
a
i
a_i
ai的个位数不等于2或4或8。
题解
我们可以分类讨论(好像也可以找规律)。
对于各组数据之间是独立的,所以我们先只考虑(ai^^bi) mod 10
因为题目只要求输出个位,所以可以让
c
i
ci
ci
=
=
=
a
i
a_i
ai mod
10
10
10
然后有
0
<
=
c
i
<
=
9
0<=ci<=9
0<=ci<=9,
c
i
ci
ci是整数。
若
c
i
=
1
ci=1
ci=1,则不管它套上多少个幂,其个位数永远是1(显然)。
同理,当
c
i
=
0
ci=0
ci=0或5或6时,其个位数永远是0或5或6.
因为题目限制了
c
i
ci
ci不等于
2
2
2或
4
4
4或
8
8
8,所以我们要考虑的数只剩下
3
,
7
,
9
3,7,9
3,7,9了。
当
c
i
=
3
ci=3
ci=3或
7
7
7时:
因为
3
4
≡
1
(
3 ^ 4 ≡ 1(
34≡1(
m
o
d
mod
mod
10
10
10),
7
4
7^4
74 ≡
1
(
1(
1(
m
o
d
mod
mod
10
10
10)
所以
c
i
ci
ci的指数
ai^ai^ai...(bi−1个ai)就相当于其mod 4后的结果。
以
c
i
=
3
ci=3
ci=3为例。不论如何,易证
a
i
≡
1
ai≡1
ai≡1或
−
1
−1
−1(
m
o
d
mod
mod
4
4
4)
若
a
i
≡
1
a_i≡1
ai≡1(
m
o
d
mod
mod
4
4
4),则原式变成了
ci^1^1^1^1^1…..=ci,个位数就是ci。
否则 a i ≡ − 1 ai≡−1 ai≡−1( m o d mod mod 4 4 4),则原式变成了
ci^(-1)^(-1)^(-1)….=ci^(-1)=ci^3,个位数易求。
当 c i = 9 ci=9 ci=9时 9 2 ≡ 1 ( 9^2≡1( 92≡1( m o d mod mod 10 10 10),同样的方法处理即可。
其实这道题的 b i b_i bi并没有实际性的用处,只是用来吓人的。
Code
#include<cstdio>
#include<cctype>
#include<algorithm>
#define for(i,a,b) for(int i = a;i <= b;i++)
using namespace std;
const int N = 100010;
inline int read()
{
int ret = 0,w = 0;
char ch = 0;
while(!isdigit(ch))
{
w |= ch == '-';
ch = getchar();
}
while(isdigit(ch))
{
ret = (ret << 3) + (ret << 1) + (ch ^ 48),ch = getchar();
}
return w ? -ret : ret;
}
inline void write(int x)
{
if(x < 0)
{
putchar('-'),x = -x;
if(size == 1)
puts("");
}
if(x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
int main()
{
//freopen("superpow.in","r",stdin);
//freopen("superpow.out","w",stdout);
int T,n,x,y;
T = read();
while(T--)
{
int ans = 1;
n = read();
for(i,1,n)
{
x = read();
y = read();
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 == z)
ans = ans * z % 10;
else
ans = ans * (z * z * z % 10) % 10;
continue;
}
}
write(ans);
puts("");
}
return 0;
}