您的位置:首页 > 其它

【jzoj5389】【NOIP2017提高A组模拟9.26】【解梦】

2017-09-28 19:11 399 查看

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 的结果。

solution

可以发现答案是aab−1%(p−1)%p。

code

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LF double
#define LL long long
#define ULL unsigned int
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
#define fr(i,j) for(int i=begin[j];i;i=next[i])
using namespace std;
int const mn=1e7+3,mo=1e9+7;
int n,m;
int Pow(LL x,int y){
LL z=1;
while(y){
if(y&1)z=z*x%mo;
x=x*x%mo;
y>>=1;
}
return z;
}
int Pow(LL x,int y,int mo){
LL z=1;
while(y){
if(y&1)z=z*x%mo;
x=x*x%mo;
y>>=1;
}
return z;
}
int main(){
freopen("dream.in","r",stdin);
freopen("dream.out","w",stdout);
scanf("%d%d",&n,&m);
if((n<=1e7)&&(m<=1e6)){
int ans=n;m--;
fo(i,1,m)ans=Pow(ans,n);
printf("%d",ans);
}else printf("%d",Pow(n,Pow(n,m-1,mo-1),mo));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: