%%% zky http://blog.csdn.net/iamzky/article/details/42211705
加强数据,被卡出屎,不知道WA了几发
对比下列算式:
(x+2)^0=1
(x+2)^1=x+2
x+2)^2=x²+4x+4
(x+2)^3=x^3+6x^2+12x+8
可以归纳出:一个n维立方形(n-cube)所包含的k维元素个数等于(x+2)^n展开式的k次项系数。
(x+2)^4=x^4+8x^3+24x^2+32x+16
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,P;
const int N=10000000;
ll inv[N+5];
inline ll Pre()
{
inv[1]=1;
for (int i=2;i<=min(n,P-1);i++)
inv[i]=(ll)(P-P/i)*inv[P%i]%P;
ll ret=1;
for (int i=1;i<=n;i++)
ret=ret*2%P;
return ret;
}
int main()
{
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
ll Xor=0,itmp,t,cnt=0;
cin>>n>>P;
itmp=Pre();
Xor^=itmp;
for(int i=1;i<=n;i++)
{
t=n-i+1;
while(t%P==0) cnt++,t/=P;
(itmp*=t)%=P;
t=i;
while(t%P==0) cnt--,t/=P;
(itmp*=inv[t%P]*inv[2]%P)%=P;
Xor^=cnt?0:itmp;
}
cout<<Xor<<endl;
return 0;
}