题解:

递推

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();
}

 

posted on 2018-02-21 13:12  宣毅鸣  阅读(136)  评论(0编辑  收藏  举报