传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3823
有点意思的题目
脑子里yy不出来4维的情况……
把前三维打个表
发现0维个数好像是 2^n
然后就是 f[i]=f[i-1]*(n-i+1)/2i 筛逆元算就完了
UPD:数据加强被叉了T_T
原因是p的倍数没有逆元……
所以记录一下当前数中有多少个p就可以了
Code:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n,p;
LL pw(LL x,LL k){
LL ans=1;
for(;k;k>>=1){
if(k&1)ans=(ans*x)%p;
x=(x*x)%p;
}return ans;
}
LL f,ans;
int inv[int(2e7+5)];
int cnt=0;
int main(){
cin>>n>>p;
ans=f=pw(2,n);cnt=0;inv[1]=1;
for(int i=2;i<=min(2*n,p-1);i++)inv[i]=(LL)(p-p/i)*inv[p%i]%p;
for(int i=1;i<=n;i++){
int tmp=n-i+1;
while(tmp%p==0)cnt++,tmp/=p;
f=(LL)f*tmp%p;
tmp=2*i;
while(tmp%p==0)cnt--,tmp/=p;
f=(LL)f*inv[tmp%p]%p;
ans^=cnt?0:f;
}cout<<ans<<endl;
return 0;
}