[JZOJ2042] SuperPow

题目描述

众所周知, a b a^b ab表示a的b次幂。例如: 2 3 2^3 23= 2 ∗ 2 ∗ 2 2*2*2 222= 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 T2行。
j ∗ 2 j*2 j2行一个整数 n n n
j ∗ 2 + 1 j*2+1 j2+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 &lt; = n , a i &lt; = 5 , 0 &lt; = b i &lt; = 3 T=1,1&lt;=n,a_i&lt;=5,0&lt;=b_i&lt;=3 T=1,1<=n,ai<=5,0<=bi<=3
对于30%的数据,满足 1 &lt; = T &lt; = 5 , 1 &lt; = n , a i &lt; = 100 , 0 &lt; = b i &lt; = 5 1&lt;=T&lt;=5,1&lt;=n,a_i&lt;=100,0&lt;=b_i&lt;=5 1<=T<=5,1<=n,ai<=100,0<=bi<=5
对于50%的数据,满足 1 &lt; = T &lt; = 20 , 1 &lt; = n , a i &lt; = 5000 , 0 &lt; = b i &lt; = 5000 1&lt;=T&lt;=20,1&lt;=n,a_i&lt;=5000,0&lt;=b_i&lt;=5000 1<=T<=20,1<=n,ai<=5000,0<=bi<=5000
对于100%的数据,满足 1 &lt; = T &lt; = 100 , 1 &lt; = n &lt; = 5000 , 1 &lt; = a i &lt; = 50000 , 0 &lt; = b i &lt; = 1 0 8 1&lt;=T&lt;=100,1&lt;=n&lt;=5000,1&lt;=a_i&lt;=50000,0&lt;=b_i&lt;=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 &lt; = c i &lt; = 9 0&lt;=ci&lt;=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( 341( 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 ai1 − 1 −1 1( m o d mod mod 4 4 4)
a i ≡ 1 a_i≡1 ai1( m o d mod mod 4 4 4),则原式变成了

ci^1^1^1^1^1…..=ci,个位数就是ci。 

否则 a i ≡ − 1 ai≡−1 ai1( 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( 921( 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值