USACO vans

USACO 在参考了网上的众多资料之后终于给我搞掉了!~

 

这道题能做出来完全归功于 新野 的

http://sinya.yo2.cn/postal-vans

的详尽的解题报告

这个解题报告写的是我读过的最详细最易懂也是最好的报告

/* ID: biran001 PROG: vans LANG: C++ */ #include<stdio.h> #include<string.h> #define FOR(i,s,e) for(int i=s;i<e;i++) #define SIZE 200 #define BASE 10000 inline int max(int a,int b) {return a>b?a:b;} struct BIGINT { int NUM[SIZE]; int len; void set(int i) { len=0; memset(NUM,0,sizeof(NUM)); while(i) { NUM[len++]=i%BASE; i/=BASE; } if(len==0)len=1; } void add(BIGINT &b) { len=max(len,b.len); FOR(i,0,len) { NUM[i]+=b.NUM[i]; NUM[i+1]+=NUM[i]/BASE; NUM[i]%=BASE; } if(NUM[len]!=0)len++; } void mul(int t) { FOR(i,0,len) { NUM[i]*=t; } FOR(i,0,len) { NUM[i+1]+=NUM[i]/BASE; NUM[i]%=BASE; } while(NUM[len]!=0) { NUM[len+1]+=NUM[len]/BASE; NUM[len]%=BASE; len++; } } void print() { printf("%d",NUM[len-1]); for(int i=len-2;i>=0;i--) printf("%04d",NUM[i]); putchar(10); } }d[1001],ans,tem1,tem2,t; void solve(int n) { ans.set(0); d[1].set(1); d[2].set(0); tem1.set(0);tem2.set(0); for(int i=3;i<=n;i++) { d[i]=d[i-2]; t=d[i-2];t.mul(2); tem1.add(t); tem2.add(tem1); d[i].add(tem2); } ans.set(0); for(int i=1;i<=n;i++) { d[i].mul(n+1-i); ans.add(d[i]); //ans.print(); } // ans.print(); ans.mul(2); // ans.print(); } int main() { freopen("vans.in","r",stdin); freopen("vans.out","w",stdout); int n; /* while(1) { scanf("%d",&n); BIGINT t; t.set(1); for(int i=2;i<=n;i++)t.mul(i); t.print(); }*/ scanf("%d",&n); solve(n-1); ans.print(); //while(1); }  

你可能感兴趣的:(c,struct)