幂运算,给一个数n,求.
数据保证 1<=n<=1000000,1<=p<=;
分析:
从数据可以得知,指数很大,直接快速幂没用,所以直接引入欧拉降幂公式
欧拉函数:
phl(n)为小于n的数与n互质的数的数量
欧拉函数代码:
ll phl(ll n)
{
ll res=n;
for(ll i=2;i*i<=n;i++)
{
if(n%i==0)
{
res=res-res/i;
while(n%i==0)
{
n/=i;
}
}
}
if(n>1)res=res-res/n;
return res;
}
整体代码实现:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll phl(ll n)
{
ll res=n;
for(ll i=2;i*i<=n;i++)
{
if(n%i==0)
{
res=res-res/i;
while(n%i==0)
{
n/=i;
}
}
}
if(n>1)res=res-res/n;
return res;
}
ll power(ll a,ll b,ll mod)
{
ll res=1;
while(b)
{
if(b&1)res=(res%mod*a%mod)%mod;
b>>=1;
a=(a%mod*a%mod)%mod;
}
return res;
}
void solve()
{
ll n,p;
cin>>n>>p;
ll md=power(2,power(2,n,phl(p))+phl(p),p);
cout<<md<<'\n';
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ll t=1;
while(t--)
solve();
return 0;
}