标签:
简单找出规律,答案为(2^n-2 )%p(1特判) 然而 n,p的最大值为 1e18 因此显然要快速幂,而且由于1e18 的平方超long long 所以在乘的时候要用快速乘法,快速乘法的原理和快速幂一样,a^b是 b个a相乘 ,快速乘法是b个a相加
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; long long n,p; long long q_mul(long long a,long long x) { long long ans=0; long long res=a; while(x){ if(x & 1){ ans=(ans+res) % p; } res = (res + res) % p; x>>=1; } return ans; } long long q_pow(long long a,long long x) { long long ans=1; long long res=a; while(x){ if(x & 1) { ans=q_mul(ans,res) % p; } res=q_mul(res,res); x>>=1; } return ans; } int main() { while(scanf("%lld%lld",&n,&p)!=EOF){ if(n==1){ printf("%lld\n",n%p); } else{ long long ans=((q_pow(2,n)-2) %p +p ) %p; printf("%lld\n",ans); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/Scale-the-heights/p/4622909.html