[JZOJ junior 2042] SuperPow

题目描述

众所周知,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<=9ci 是整数。
ci=1 ,则不管它套上多少个幂,其个位数永远是 1 (显然)。
同理,当 ci=0 5 6 时,其个位数永远是 0 5 6 .
因为题目限制了 ci 不等于 2 4 8 ,所以我们要考虑的数只剩下 3,7,9 了。
ci=3 7 时:
因为 341(mod 10),741(mod 10)
所以 ci 的指数 aiaiai...(bi1ai) 就相当于其 mod 4 后的结果。
ci=3 为例。不论如何,易证 ai1 1(mod 4)
ai1(mod 4) ,则原式变成了ci^1^1^1^1^1…..=ci,个位数就是 ci
否则 ai1(mod 4) ,则原式变成了ci^(-1)^(-1)^(-1)….=ci^(-1)=ci^3,个位数易求。
ci=9 921(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;
}

你可能感兴趣的:(数学,同余)