Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
不容易啊!!! 2180K 32MS#include <cstdio> #include <cstring> #include <algorithm> #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; template<typename T> inline T read() { T x=0,f=1;char c=getchar(); while (c<'0' || c>'9'){if (c=='-')f=-1;c=getchar();} while (c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-48;c=getchar();} return x*f; } const int MAXN=51; const int SIZE=4; const int BIT=10000; const int MAXM=201; int n; struct prec { int len; int x[MAXM]; inline prec() { len=0; memset(x,0,sizeof(x)); } inline struct prec operator = (int tmp) { while (tmp) { x[++len]=tmp%BIT; tmp/=BIT; } return *this; } inline void print(char c) { printf("%d",x[len]); for (int i=len-1;i>=1;i--) printf("%04d",x[i]); printf("%c",c); } inline struct prec operator + (int tmp) { struct prec ans;ans.len=len; for (int i=1;i<=len;i++) { ans.x[i]=x[i]+tmp; tmp=ans.x[i]/10; ans.x[i]%=10; } if (tmp>0) ans.x[++ans.len]=tmp; return ans; } inline struct prec operator + (struct prec tmp) { struct prec ans;ans.len=max(len,tmp.len); int c=0; for (int i=1;i<=ans.len;i++) { ans.x[i]=x[i]+tmp.x[i]+c; c=ans.x[i]/BIT; ans.x[i]%=BIT; } if (c>0) ans.x[++ans.len]=c; return ans; } inline struct prec operator - (struct prec tmp) { struct prec ans;ans.len=len; for (int i=1;i<=len;i++) { ans.x[i]+=(x[i]-tmp.x[i]); if (ans.x[i]<0) ans.x[i]+=BIT,ans.x[i+1]--; } while (ans.x[ans.len]==0) ans.len--; return ans; } inline struct prec operator * (int tmp) { struct prec ans;ans.len=len; int c=0; for (int i=1;i<=len;i++) { ans.x[i]=x[i]*tmp+c; c=ans.x[i]/BIT; ans.x[i]%=BIT; } while (c>0) { ans.x[++ans.len]=c%BIT; c/=BIT; } return ans; } inline struct prec operator * (struct prec tmp) { struct prec ans; int id; for (int i=1;i<=len;i++) { int c=0; for (int j=1;j<=tmp.len;j++) { ans.x[i+j-1]+=(x[i]*tmp.x[j]+c); c=ans.x[i+j-1]/BIT; ans.x[i+j-1]%=BIT; } id=i+tmp.len-1; while (c>0) { ans.x[++id]=c%BIT; c/=BIT; } ans.len=max(id,ans.len); } return ans; } inline struct prec operator / (int tmp) { struct prec ans; int c=0;ans.len=len; for (int i=len;i>=1;i--) { c=c*BIT+x[i]; ans.x[i]=c/tmp; c%=tmp; } while (ans.x[ans.len]==0) ans.len--; return ans; } }f[MAXN],c[MAXN][MAXN]; inline struct prec turn_prec(int tmp) { struct prec ans; while (tmp) { ans.x[++ans.len]=tmp%BIT; tmp/=BIT; } return ans; } inline struct prec qpow(struct prec a,long long b) { struct prec res;res=1; while (b) { if (b&1) res=res*a; a=a*a;b>>=1; } return res; } inline struct prec calc(int n) { return qpow(turn_prec(2),n*(n-1)/2); } inline void init() { c[0][0]=1; for (int i=1;i<=50;i++) { c[i][0]=c[i][i]=1; for (int j=1;j<i;j++) c[i][j]=c[i-1][j]+c[i-1][j-1]; } f[0]=1;f[1]=1; for (int i=2;i<=50;i++) { f[i]=calc(i); for (int j=1;j<i;j++) f[i]=f[i]-(f[j]*c[i-1][j-1]*calc(i-j)); } } int main() { init(); while (true) { n=read<int>(); if (n==0) break; f[n].print('\n'); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator