1. 程式人生 > >bzoj1089: [SCOI2003]嚴格n元樹

bzoj1089: [SCOI2003]嚴格n元樹

ios main pan tdi eof nbsp return 嚴格 algorithm

這題方程就是f(i)=f(i-1)^n+1

高精度謝謝。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
struct node
{
    int a[1100],len;
    node(){}
    void init()
    {
        memset(a,0,sizeof
(a));a[1]=1; len=1; } void jia(int x) { a[1]+=x; for(int i=1;i<=len;i++) { a[i+1]+=a[i]/10; a[i]%=10; } int i=len; while(a[i+1]>0) { i++; a[i+1]+=a[i]/10; a[i]
%=10; } } node cheng(node n1,node n2) { node n3;n3.len=n1.len+n2.len-1; memset(n3.a,0,sizeof(n3.a)); for(int i=1;i<=n1.len;i++) for(int j=1;j<=n2.len;j++) n3.a[i+j-1]+=n1.a[i]*n2.a[j]; for(int i=1
;i<=n3.len;i++) { n3.a[i+1]+=n3.a[i]/10; n3.a[i]%=10; } int i=n3.len; while(n3.a[i+1]>0) { i++; n3.a[i+1]+=n3.a[i]/10; n3.a[i]%=10; } n3.len=i; return n3; } void jian(node n2) { for(int i=1;i<=len;i++)a[i]-=n2.a[i]; for(int i=1;i<=len;i++) { if(a[i]<0) { a[i]+=10; a[i+1]--; } } while(a[len]==0)len--; } }f[2]; int main() { int n,d; scanf("%d%d",&n,&d); int now=0;f[now].init(); for(int i=1;i<=d;i++) { now=1-now; f[now].init(); for(int j=1;j<=n;j++) f[now]=f[now].cheng(f[1-now],f[now]); f[now].jia(1); } f[now].jian(f[1-now]); for(int i=f[now].len;i>=1;i--)printf("%d",f[now].a[i]); printf("\n"); return 0; }

bzoj1089: [SCOI2003]嚴格n元樹