2 233 3 5
2 1HintIn the first case, both sequence {1, 2} and {2, 1} are legal. In the second case, sequence {1, 2, 3}, {1, 3, 2}, {2, 1, 3}, {2, 3, 1}, {3, 1, 2}, {3, 2, 1} are legal, so the answer is 6 mod 5 = 1
其中,快速乘法就是把乘数a的2进制(100010101)2 这样的数
分解成(2^p0+2^p1+...)*b=2^p0*b+2^p1*b .... 然后算
本题快速幂和快速乘法均用栈。
PS:由于忘了在sub()处%F 又WA又T的
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<functional> #include<iostream> #include<cmath> #include<cctype> #include<ctime> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define Rep(i,n) for(int i=0;i<n;i++) #define ForD(i,n) for(int i=n;i;i--) #define RepD(i,n) for(int i=n;i>=0;i--) #define Forp(x) for(int p=pre[x];p;p=next[p]) #define Forpiter(x) for(int &p=iter[x];p;p=next[p]) typedef __int64 ll; ll n,F; ll add(ll a,ll b){return (a+b)%F;} void upd(ll &a,ll b){a=(a%F+b%F)%F;} ll mul(ll a,ll b) //c=a*b=a^l1+a^l2+...+a^l3 //把b改成2进制,各位分别相乘相加 { ll c=0; while(b) { if (b&1) c=(c+a)%F; a=(a+a)%F; b>>=1; } return c%F; } ll sub(ll a,ll b){if ((a-b)<0) return (a-b+F)%F;return (a-b)%F;} ll pow2(ll a,ll b) { if (b==1) return a%F; if (b==0) return 1%F; ll ret=1; while (b) { if (b&1) ret=mul(ret,a); a=mul(a,a); b>>=1; } return ret%F; } int main() { // freopen("zhx's contest.in","r",stdin); while(scanf("%I64d%I64d",&n,&F)==2) { if (n==1) printf("%I64d\n",1%F); else printf("%I64d\n",sub(pow2(2%F,n),2)); } return 0; }