[JZOJ junior 2042] SuperPow

来源:互联网 发布:淘宝中差评扣分 编辑:程序博客网 时间:2024/06/14 16:42

题目描述

众所周知,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=056时,其个位数永远是056.
因为题目限制了ci不等于248,所以我们要考虑的数只剩下3,7,9了。
ci=37时:
因为341(mod 10),741(mod 10)
所以ci的指数aiaiai...(bi1ai)就相当于其mod 4后的结果。
ci=3为例。不论如何,易证ai11(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=9921(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;}
0 1