Counting of Trees AtCoder - 5633

2573 ワード

Counting of Trees
Problem Statement
 
Given is an integer sequence D1,…,DN of N elements. Find the number, modulo 998244353, of trees with N vertices numbered 1 to N that satisfy the following condition:
  • For every integer i from 1 to N, the distance between Vertex 1 and Vertex i is Di.

  • Notes
     
  • A tree of N vertices is a connected undirected graph with N vertices and N−1 edges, and the distance between two vertices are the number of edges in the shortest path between them.
  • Two trees are considered different if and only if there are two vertices x and y such that there is an edge between x and y in one of those trees and not in the other.

  • Constraints
     
  • 1≤N≤105
  • 0≤Di≤N−1

  • Input
    Input is given from Standard Input in the following format:
    N
    D1 D2 … DN
    

    Output
     
    Print the answer.
    Sample Input 1
     
    4
    0 1 1 2
    

    Sample Output 1
     
    2
    

    For example, a tree with edges (1,2), (1,3), and (2,4) satisfies the condition.
    Sample Input 2
     
    4
    1 1 1 1
    

    Sample Output 2
     
    0
    

    Sample Input 3
     
    7
    0 3 2 1 2 2 1

    Sample Output 3
     
    24

    題意:一連のシーケンスを与え、各数字は最初の木までの距離を表し、木のすべての可能な配列個数を求める.
    構想:まず木が合法かどうかを判定する:第1の数字は必ず0で、しかもすべての木の距離、中間は中断することができなくて、必ず1-2-3-4-5-6...
    木の各層の可能な配列数の積に違いない.
    しかし、私は最初はサンプル3の3番目の層がA 34(3 4の全配列)であるべきだと勘違いしていたが、A 34の結果は6であり、実際の配列数は8,2の3次方emmmmm(私は最初は二叉木の配列をデフォルトとした.)1本の木と2本以上の木がつながっているものが存在します.
    したがって,各層のツリーの次のツリーの次のべき乗の積である.
    2000 msの问题は私はすべてtleを补うことができます...O 2を加えて最適化したもの(AtCoderが使えるかどうか分からない)
     
    #pragma GCC optimize(2) 
    #include
    
    using namespace std;
    const int mod=998244353;
    long long a[100010];
    long long n,x;
    long long ksm(long long a,long long b){
    	long long res=1;
    	while(b){
    		if(b&1){
    			res*=a;
    			res%=mod;
    		}
    		a*=a;
    		a%=mod;
    		b>>=1;
    	}
    	return res;
    }
    
    int main(){
    //	ios::sync_with_stdio(0);
    //	cin.tie(0),cout.tie(0);
    	scanf("%lld",&n);
    	int flag=0;
    	scanf("%lld",&x);
    	int ans=x;
    	if(x!=0) flag=1;
    	for(int i=1;ians){
    			ans=x;
    		}
    	}
    	
    	if(flag){
    		printf("0
    "); } else{ long long sum=1; for(int i=1;i