MINIEYE杯第十六届华中科技大学程序设计邀请赛
作者:互联网
MINIEYE杯第十六届华中科技大学程序设计邀请赛
B Contest Preparation(签到)
// Author: yukito8069
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
#define int long long
typedef long long ll;
typedef double dd;
typedef pair<int, int> pii;
signed main() {
IOS;
int t; cin >> t;
while(t--) {
int n, m; cin >> n >> m;
if(n == 0) {
cout << 0 << "\n";
continue;
}
if(m >= n) {
cout << 2 << "\n";
}
else {
int num = n % m;
int ans = n / m;
int num2 = n + num;
ans += num2 / m + (num2 % m != 0);
cout << ans << "\n";
}
}
}
M XOR Almost Everything (位运算 思维)
思路:这题我们倒着想,想想从全是0的状态能不能推到当前状态。我们每次可以选n - 1个数来异或上一个数,而异或一个数偶数次相当于没有异或它。而当我们数的个数是奇数的时候,每次都会有偶数个数被异或上那个数,所以奇数的合法情况就是所有数异或在一起的值是0。而偶数个的情况都可以由全是零的情况得到。
// Author: yukito8069
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
typedef long long ll;
typedef double dd;
typedef pair<int, int> pii;
int a[100010];
int main() {
IOS;
int n; cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
if(n % 2 == 0) {
cout << "YES\n";
}
else {
int ans = a[1];
for (int i = 2; i <= n; i++) {
ans ^= a[i];
}
if(ans == 0) {
cout << "YES\n";
}
else {
cout << "NO\n";
}
}
}
H Permutation Counting (组合数 树形dp 并查集)
题意:你有\(1-n\)的数,再给你m组\(x,y\)对,每一组代表\(p_x<p_y\)的关系,保证每次给的x互不相同。求满足所有关系的方案数。
首先我们可以用并查集的方式来判断有没有出现矛盾,每次给定一个关系的时候我们就把他们合并在一起。再出现下一个关系的时候检查他们两个是否已经在一个集合里面了,因为x每次都互不相同,所以当出现两个已经在同一个集合里的数的时候就是相当于和之前不等式两边的位置反了反,就相当于是矛盾了,这种时候直接输出0就行。我们在建图的同时拿一个rt数组来标记根节点。
这道题的图应该是一个森林,设res为剩余的还没有分配的数的数量,cnt为以该节点为根的子树的节点的数量。每次对于一棵树,我们让\(ans=ans*C_{res}^{cnt[i]}\),同时对每棵树进行递归,设cp为该节点为根的子树经过一些分配后剩余的节点数。搜到一个节点的时候让\(ans=ans*C_{cp-1}^{cnt[j]}\),再让\(cp=cp-cnt[j]\)就好了。
// Author: yukito8069
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
typedef long long ll;
typedef double dd;
typedef pair<int, int> pii;
const int mod = 998244353;
const int N = 2000010;
const int M = 4000010;
int n, m;
int h[N], e[M], ne[M], idx, fa[N];
int rt[N];
int cnt[N];
ll fac[N], infac[N];
ll ans = 1;
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
ll qmi(ll d, ll z) {
ll ret = 1;
while(z) {
if(z & 1) {
ret = d * ret % mod;
}
z >>= 1;
d = d * d % mod;
}
return ret;
}
void dfs(int cur) {
cnt[cur] = 1;
for (int i = h[cur]; i != -1; i = ne[i]) {
int j = e[i];
dfs(j);
cnt[cur] = (cnt[cur] + cnt[j]) % mod;
}
}
int find(int x) {
int k, j, r;
r = x;
while(r != fa[r]) r = fa[r];
k = x;
while(k != r) {
j = fa[k];
fa[k] = r;
k = j;
}
return r;
}
ll c(ll a, ll b) {
return fac[a] * infac[b] % mod * infac[a - b] % mod;
}
void dfs2(int cur) {
int cp = cnt[cur];
for (int i = h[cur]; i != -1; i = ne[i]) {
int j = e[i];
ans = ans * c(cp - 1, cnt[j]) % mod;
cp -= cnt[j];
dfs2(j);
}
}
int main() {
IOS;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
h[i] = -1;
fa[i] = i;
}
for (int i = 1; i <= m; i++) {
int x, y; cin >> x >> y;
if(find(x) == find(y)) {
cout << 0;
return 0;
}
fa[find(x)] = find(y);
add(y, x);
rt[x] = y;
}
fac[0] = infac[0] = 1;
for (int i = 1; i <= n; i++) {
fac[i] = fac[i - 1] * i % mod;
infac[i] = infac[i - 1] * qmi(i, mod - 2) % mod;
}
int res = n;
for (int i = 1; i <= n; i++) {
if(rt[i] == 0) {
dfs(i);
ans = ans * c(res, cnt[i]) % mod;
res -= cnt[i];
dfs2(i);
}
}
cout << ans << "\n";
}
标签:cnt,cur,第十六届,华中科技大学,ll,typedef,int,MINIEYE,include 来源: https://www.cnblogs.com/yukito/p/16326374.html