题目描述
Description
DYY 很善于解梦,昨晚,他梦见自己来到了一个高度发达的国度。
众所周知,我们现在有极为常用的三级运算,+、、^。其中,a*b=a+a+a+…+a(b 个a),a^b=a*a*a…*a(b 个a)。但是,在这个国家,还有第四级运算——♂,a♂b=a^a^a^…^a(b 个a,从左往右计算)。同时,由于这个国家的历史背景,他们非常反感高精度,所以a♂b 的结果是经过1e9+7 取模的。
DYY 觉得这个梦可能意味着他将成为全球第一的解梦第二的数学之神,但要彻底解开它,DYY 必须算出来a♂b 的结果。
Input
第一行:两个正整数,a 和b。
Output
一个整数,a♂b mod 1e9+7。
Sample Input
2 4
Sample Output
256
Data Constraint
Hint
2♂4=2^2^2^2=4^2^2=16^2=256
思路
这题出的真是,诡异的♂……(哲♂学之王bili……咳咳)
因为(((a^x1)^x2)^……xk)=a^(x1 * x2 * ……xk),所以a♂b=a^(a^(b-1))
用两次快速幂就可以AC了
但还要注意一点取模的问题,若T=10e+7:
code
#include<cstdio>
#define mod 1000000007
using namespace std;
long long n,m;
long long pow(long long x,long long y,long long z)
{
long long ans=1;
while (y)
{
if (y&1)ans=ans*x%z;
x=x*x%z;
y/=2;
}
return ans;
}
int main()
{
freopen("dream.in","r",stdin);
freopen("dream.out","w",stdout);
scanf("%lld%lld",&n,&m);
long long t=pow(n,m-1,mod-1);
printf("%lld\n",pow(n,t,mod));
return 0;
}