SRM 733 Div 1 爆零记

开场写easy(有预感要FST)

然后medium就卡住了。

我只知道$n$个点的生成树个数是$n^{n-2}$

接下来直接狗带……

 

 

$Problem 250pts$

水题,直接枚举然后记录答案(我大概是因为精度问题被HACK了)

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b)	for (int i(a); i >= (b); --i)
#define MP		make_pair
#define fi		first
#define se		second

typedef long long LL;
typedef pair <int, int> PII;
typedef pair <PII, PII> PIIII;

const double eps = 1e-12;

class MinimizeAbsoluteDifferenceDiv1 {
	public:
		vector<int> findTuple(vector<int> x) {

			PIIII ans = MP(MP(1e9, 1e9), MP(1e9, 1e9));

			double ff = 1e9;
			rep(i, 0, 4){
				rep(j, 0, 4){
					if (i == j) continue;
					rep(k, 0, 4){
						if (k == i || k == j) continue;
						rep(l, 0, 4){
							if (l == i || l == j || l == k) continue;
							double aa = fabs(1.00 * x[i] / x[j] - 1.00 * x[k] / x[l]);

							if (aa < ff - eps){
								ff = aa;
								ans = MP(MP(i, j), MP(k, l));
							}
						}
					}
				}
			}

			vector <int>  ret;
			ret.push_back(ans.fi.fi);
			ret.push_back(ans.fi.se);
			ret.push_back(ans.se.fi);
			ret.push_back(ans.se.se);
			return ret;
		}
};

 

$Problem 500Pts$

给定一个边集,求符合条件的生成树的个数(生成树的边必须包含这个边集,点数 <= $1000$)

比赛的时候差一点就推出公式乐……不知道为什么

设连通块个数为$s$,每个连通块的点数的乘积为$m$,

那么答案为$mn^{s-2}$

 

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b)	for (int i(a); i >= (b); --i)
#define MP		make_pair
#define fi		first
#define se		second

typedef long long LL;

const int N = 1e3 + 10;
const LL mod = 987654323;

class BuildingSpanningTreesDiv1 {
	public:

		int father[N], c[N];

		inline LL Pow(LL a, LL b, LL mod){
			LL ret(1);
			for (; b; b >>= 1, (a *= a) %= mod) if (b & 1) (ret *= a) %= mod;
			return ret;
		}

		int getfather(int x){
			return father[x] ? father[x] = getfather(father[x]) : x;
		}

		int getNumberOfSpanningTrees(int n, vector <int> a, vector <int> b) {
			int m = (int)a.size();

			memset(father, 0, sizeof father);

			int block = n;
			rep(i, 0, m - 1){
				int x = a[i], y = b[i];
				int fx = getfather(x), fy = getfather(y);
				if (fx == fy) return 0;

				--block;
				father[fx] = fy;
			}

			memset(c, 0, sizeof c);
			rep(i, 1, n){
				int x = getfather(i);
				++c[x];
			}

			vector <LL> v;
			rep(i, 1, n) if (c[i]) v.push_back(c[i]);

			if (block == 1) return 1;
			LL ans = Pow((LL)n, (LL)block - 2, mod);
			for (auto u : v) ans = ans * u % mod;
			return (int)ans;
		}
};

 

posted @ 2018-04-17 09:14  cxhscst2  阅读(212)  评论(0编辑  收藏  举报