1005: [HNOI2008]明明的烦恼 - #include <Seter> - using namespace Orz;
1005: [HNOI2008]明明的烦恼
http://www.zybbs.org/JudgeOnline/problem.php?id=1005
RunID | User | Problem | Result | Memory | Time | Language | Code Length | Submit Time |
141673 | Seter | 1005 | Accepted | 756 kb | 28 ms | C/Edit | 885 B | 2011-08-12 21:15:51 |
这个题是裸的Pru(点点)ferCode……第一眼看过去就知道了……但是要写个高精度……不用longlong的话压6位还是可以的
就是用1~n填充n-2个空,对于确定度数x的点必须恰好出现x-1次C(n,x-1)//n是在变的。最后不缺定度数的x个点再填充剩下的y个空x^y。全部乘起来。
#include <stdio.h> int ans[500],s=499; main(){ int n,i,t,j,k,m,l,a; scanf("%d",&n); l=a=n; ans[499]=1; for(i=0;i<a;i++){ scanf("%d",&t); if(--t==-2)continue; for(m=j=0;j<t;j++){ for(k=499;k>=s;k--){ ans[k]=ans[k]*(n-2-j)+m; m=ans[k]/1000000; ans[k]%=1000000; }while(m){ ans[--s]=m%1000000; m/=1000000; } }for(j=2;j<=t;j++){ m=0; for(k=s;k<500;k++){ ans[k]+=m*1000000; m=ans[k]%j; ans[k]/=j; }while(!ans[s])s++; }n-=t;l--; }n-=2; while(n--){ m=0; for(k=499;k>=s;k--){ ans[k]=ans[k]*l+m; m=ans[k]/1000000; ans[k]%=1000000; }while(m){ ans[--s]=m%1000000; m/=1000000; } }printf("%d",ans[s]); for(s++;s<500;s++)printf("%06d",ans[s]); putchar(10); return 0; }