NC21609. 生成树计数
描述
输入描述
第一行先输入一个整数n (4 ≤ ≤ 1000)
第二行输入n-3个整数x[i] (1 ≤ x[i] ≤ n - 1)
第三行输入n-3个整数y[i] (2 ≤ y[i] ≤ n)
(x[i] < y[i])
输出描述
输出一个整数
示例1
输入:
4 1 2
输出:
8
示例2
输入:
4 3 4
输出:
8
示例3
输入:
5 1 2 2 3
输出:
15
示例4
输入:
6 1 1 2 2 3 3
输出:
0
示例5
输入:
5 1 2 4 5
输出:
20
示例6
输入:
6 1 3 5 2 4 6
输出:
48
示例7
输入:
10 1 2 3 4 5 6 7 2 4 6 7 8 9 10
输出:
300
C++11(clang++ 3.9) 解法, 执行用时: 10ms, 内存消耗: 412K, 提交时间: 2020-10-02 20:24:31
#include<bits/stdc++.h> using namespace std; #define ll long long #define f(i,a,b) for(int i=a;i<=b;i++) inline ll r() { ll x=0,f=1; char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(isdigit(c))x=x*10+c-'0',c=getchar(); return x*f; } #define d r() ll n; ll fa[1010]; ll x[1010]; ll find(ll x){ if(fa[x]==x)return x; else return fa[x]=find(fa[x]); } ll a[1010]; ll ans,cmp; int main(){ n=ans=d; f(i,1,n)fa[i]=i; f(i,1,n-3)x[i]=d; f(i,1,n-3){ ll y=d; ll xx=find(x[i]),yy=find(y); if(xx!=yy)fa[xx]=yy; } f(i,1,n)a[find(i)]++; f(i,1,n)if(a[i])ans*=a[i],ans%=987654323,cmp++; if(cmp!=3)ans=0; printf("%lld",ans); return 0; }