这题我们可以看出一个n维物体有2^n-1个点,之后每一个点连接n个边,每一个边连接n-1个面etc所以就建立出了最基础的暴力。 但是找规律也可以看出 ai=C(n,i)∗2n−i
还是L神的正解好了,我的暴力不忍直视
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; #define MAXN 11000000 int inv[MAXN]; int prime[1100000],topp=-1; bool pflag[MAXN]; long long n,p; long long pow_mod(long long x,long long y) { long long ret=1; while (y){ if (y&1)ret=ret*x%p; x=x*x%p; y>>=1; } return ret; } void init() { inv[1]=1; for (register int i=2;i<=n;i++){ if (!pflag[i]){ prime[++topp]=i; inv[i]=pow_mod(i,p-2); } for (register int j=0;j<=topp && (long long )i*prime[j]<MAXN;j++){ pflag[i*prime[j]]=true; inv[i*prime[j]]=(long long )inv[i]*inv[prime[j]]%p; if (i%prime[j]==0)break; } } } int main() { freopen("cube.in","r",stdin); freopen("cube.out","w",stdout); scanf("%I64d%I64d",&n,&p); long long x,y,z; int j,k; long long ans=0; init(); x=1;y=1; ans^=x*y%p; int totp=0; for(register int i=1;i<=n;i++){ x=x*2%p; z=n-i+1; while (z%p==0)totp++,z/=p; y=y*z%p; z=i; while (z%p==0)totp--,z/=p; y=y*inv[z%p]%p; ans^=totp?0:x*y%p; } printf("%I64d\n",ans); return 0; }