题解:
递推
f[i]=f[i-1]^n+1
ans=f[d]-f[d-1]
代码:
#include<bits/stdc++.h> using namespace std; int n,m; struct zz { int len,a[5005]; void init() { memset(a,0,sizeof a); len=0; } void write() { printf("%d",a[len]); for (int i=len-1;i;i--) { if (a[i]<10)putchar('0'); if (a[i]<100)putchar('0'); if (a[i]<1000)putchar('0'); printf("%d",a[i]); } } }f[30]; zz cf(zz x,zz y) { zz z; z.init(); z.len=x.len+y.len-1; for (int i=1;i<=x.len;i++) for (int j=1;j<=y.len;j++) z.a[i+j-1]+=x.a[i]*y.a[j]; for (int i=1;i<=z.len;i++) { z.a[i+1]+=z.a[i]/10000; z.a[i]%=10000; } if (z.a[z.len+1])z.len++; return z; } zz jf(zz z) { z.a[1]++; for (int i=1;i<=z.len;i++) { z.a[i+1]+=z.a[i]/10000; z.a[i]%=10000; } if (z.a[z.len+1])z.len++; return z; } zz zf(zz x,zz y) { for (int i=1;i<=x.len;i++) { x.a[i]-=y.a[i]; if (x.a[i]<0)x.a[i+1]--,x.a[i]+=10000; } while (x.len>1&&x.a[x.len]==0)x.len--; return x; } int main() { scanf("%d%d",&n,&m); if (m==0) { puts("1"); return 0; } f[0].a[1]=f[0].len=1; for (int i=1;i<=m;i++) { f[i].a[1]=f[i].len=1; for (int j=1;j<=n;j++) f[i]=cf(f[i],f[i-1]); f[i]=jf(f[i]); } zz ans=zf(f[m],f[m-1]); ans.write(); }