BZOJ 1005 小明的烦恼 普吕弗序列
普吕弗序列不难了,是关于树计数的吧(和基尔霍夫不同的是,基尔霍夫是给定了边的情况,而普吕弗序列是给定了每个点的度)!
理论:
大致就是这个样子吧!(将就着看吧!毕竟太年轻)。
结论: http://hzwer.com/3272.html
加油!(只是我积了好久的题了,毕竟以前编码能力比较弱,一直没写掉,最后把它写掉了)
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #define mod 10000 5 #define ll long long 6 #define rep(i,j,k) for(int i = j; i <= k; i++) 7 #define down(i,j,k) for(int i = j; i >= k; i--) 8 #define clr(i,j) memset(i,j,sizeof(i)) 9 using namespace std; 10 11 int prime[500], cnt = 0, num[500]; bool vis[1005]; 12 int a[1005] = {0}; 13 int ans[1005] = {0}; 14 15 inline int read() 16 { 17 int s = 0, t = 1; char c = getchar(); 18 while( !isdigit(c) ){ 19 if( c == '-' ) t = -1; c = getchar(); 20 } 21 while( isdigit(c) ){ 22 s = s* 10 + c - '0'; c = getchar(); 23 } 24 return s * t; 25 } 26 27 void getpri() 28 { 29 clr(vis,0); 30 rep(i,2,1005){ 31 if( !vis[i] ) prime[cnt++] = i; 32 for(int j = 0; j < cnt && prime[j] * i <= 1005; j++) 33 vis[prime[j]*i] = 1; 34 } 35 } 36 37 void chuli(int a,int f) 38 { 39 rep(i,2,a){ 40 int x = i; 41 rep(j,0,cnt-1){ 42 while( x % prime[j] == 0 ) num[j] += f, x /= prime[j]; 43 if( x == 1 ) break; 44 } 45 } 46 } 47 48 void che(int zhi) 49 { 50 rep(i,1,ans[0]){ 51 ans[i] *= zhi; 52 } 53 rep(i,1,ans[0]){ 54 ans[i+1] += ans[i] / mod; 55 ans[i] %= mod; 56 } 57 while( ans[ans[0]+1] ) ans[0]++, ans[ans[0]+1] += ans[ans[0]]/mod, ans[ans[0]]%=mod; 58 } 59 60 void print() 61 { 62 down(i,ans[0],1){ 63 if( i == ans[0] ) printf("%d", ans[i] ); 64 else printf("%04d", ans[i]); 65 } 66 } 67 68 int main() 69 { 70 getpri(); 71 int n = read(), tot = 0, m = 0; ans[0] = 1, ans[1] = 1; 72 if( n == 1 ){ 73 int x = read(); 74 if( !x ) puts("1"); 75 else puts("0"); 76 return 0; 77 } 78 rep(i,1,n){ 79 a[i] = read(); 80 if( !a[i] ){ 81 puts("0"); return 0; 82 } else if( a[i] == -1 ) m++; 83 if( a[i] != -1 ) a[i]--, tot += a[i]; 84 } 85 if( tot > n-2 ) { 86 puts("0"); 87 return 0; 88 } 89 rep(i,1,n){ 90 if( a[i] != -1 ) 91 chuli(a[i],-1); 92 } 93 chuli(n-2,1); chuli(n-2-tot,-1); 94 rep(i,0,cnt-1){ 95 while( num[i]-- ) che( prime[i] ); 96 } 97 int k = n-2-tot; 98 while( k-- ){ 99 che(m); 100 } 101 print(); 102 cout<<endl; 103 return 0; 104 }
————————————————