Codeforces Round #589 (Div. 2)
Contest Info
[Practice Link](https://codeforces.com/contest/1228)
Solved | A | B | C | D | E | F |
---|---|---|---|---|---|---|
5/6 | O | O | O | O | Ø | - |
- O 在比赛中通过
- Ø 赛后通过
- ! 尝试了但是失败了
- - 没有尝试
Solutions
A. Distinct Digits
签到。
B. Filling the Grid
签到。
C. Primes and Multiplication
题意:
定义\(prime(x)\)为\(x\)的所有质因子构成的集合。
定义\(g(x, p)\)为最大的\(p^k\)满足\(p^k \;|\; x\),
定义\(f(x, y)\)为:
\prod\limits_{p \in prime(x)} g(y, p)
\end{eqnarray*}
\]
现在给出\(x, n\),要求计算:
\]
思路:
枚举\(x\)的每个质因子,再从高到低枚举每个质因子的幂次,考虑对于一个质因子\(p\),用\(f[i]\)表示\([1, n]\)中有多少个\(p^i\)的倍数,且不是\(p^j (j > i)\)的倍数,那么个数是\(\left\lfloor n / p^i \right\rfloor - \left\lfloor n / p^{i + 1} \right\rfloor\)
代码:
view code
#include <bits/stdc++.h>
using namespace std;
#define debug(...) { printf("# "); printf(__VA_ARGS__); puts(""); }
#define fi first
#define se second
#define endl "\n"
using ll = long long;
using pII = pair <int, int>;
using pLL = pair <ll, ll>;
using VI = vector <int>;
using VL = vector <ll>;
constexpr int mod = 1e9 + 7;
template <class T1, class T2> inline void chadd(T1 &x, T2 y) { x += y; while (x >= mod) x -= mod; while (x < 0) x += mod; }
template <class T1, class T2> inline void chmax(T1 &x, T2 y) { if (x < y) x = y; }
template <class T1, class T2> inline void chmin(T1 &x, T2 y) { if (x > y) x = y; }
inline int rd() { int x; cin >> x; return x; }
template <class T> inline void rd(T &x) { cin >> x; }
template <class T> inline void rd(vector <T> &vec) { for (auto &it : vec) cin >> it; }
template <class T> inline void out(T s) { cout << s << "\n"; }
template <class T> inline void out(vector <T> &vec) { for (auto &it : vec) cout << it << " "; cout << endl; }
inline ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
inline ll qpow(ll base, ll n) { ll res = 1; while (n) { if (n & 1) res = res * base % mod; base = base * base % mod; n >>= 1; } return res; }
constexpr int N = 1e5 + 10;
ll x, n, bit[110];
inline ll ceil(ll x, ll y) {
return (x + y - 1) / y;
}
void run() {
vector <int> fac;
for (ll i = 2; i * i <= x; ++i) {
if (x % i == 0) fac.push_back(i);
while (x % i == 0) x /= i;
}
if (x != 1) fac.push_back(x);
ll res = 1;
for (auto &it : fac) {
if (it > n) continue;
int k = 1; bit[1] = it;
for (int i = 2; ; ++i) {
if (bit[i - 1] > ceil(n, it)) {
k = i - 1;
break;
}
bit[i] = bit[i - 1] * it;
}
ll tot = 0;
for (int i = k; i >= 1; --i) {
ll p = n / bit[i];
p -= tot;
res = res * qpow(bit[i] % mod, p % (mod - 1)) % mod;
tot += p;
}
}
out(res);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cout << fixed << setprecision(20);
while (cin >> x >> n) run();
return 0;
}
D. Complete Tripartite
题意:
现在给出一张\(n\)个点\(m\)条边的无向图,没有自环和重边, 问能否将点分成三个集合,使得集合内部的点之间没有边相连,但任意两个点(他们分属不同的集合)有边相连。
如果可以,输出方案。
思路:
考虑同一点集里所有的点连出去的边都是相同的,那么根据这个\(Hash\),如果刚好有三种\(Hash\)值,那么按\(Hash\)值分类即可
代码:
view code
#include <bits/stdc++.h>
using namespace std;
#define debug(...) { printf("# "); printf(__VA_ARGS__); puts(""); }
#define fi first
#define se second
#define endl "\n"
using ll = long long;
using ull = unsigned long long;
using pII = pair <int, int>;
using pLL = pair <ll, ll>;
using VI = vector <int>;
using VL = vector <ll>;
constexpr int mod = 1e9 + 7;
template <class T1, class T2> inline void chadd(T1 &x, T2 y) { x += y; while (x >= mod) x -= mod; while (x < 0) x += mod; }
template <class T1, class T2> inline void chmax(T1 &x, T2 y) { if (x < y) x = y; }
template <class T1, class T2> inline void chmin(T1 &x, T2 y) { if (x > y) x = y; }
inline int rd() { int x; cin >> x; return x; }
template <class T> inline void rd(T &x) { cin >> x; }
template <class T> inline void rd(vector <T> &vec) { for (auto &it : vec) cin >> it; }
template <class T> inline void out(T s) { cout << s << "\n"; }
template <class T> inline void out(vector <T> &vec) { for (auto &it : vec) cout << it << " "; cout << endl; }
inline ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
inline ll qpow(ll base, ll n) { ll res = 1; while (n) { if (n & 1) res = res * base % mod; base = base * base % mod; n >>= 1; } return res; }
constexpr int N = 3e5 + 10;
int n, m, ans[N];
mt19937 rnd(time(0));
ull f[N], g[N];
map <ull, vector<int>> mp;
void run() {
for (int i = 1; i <= n; ++i) f[i] = rnd();
memset(g, 0, sizeof g);
mp.clear();
for (int i = 1, u, v; i <= m; ++i) {
cin >> u >> v;
g[u] ^= f[v];
g[v] ^= f[u];
}
for (int i = 1; i <= n; ++i) {
mp[g[i]].push_back(i);
if (mp.size() > 3) return out(-1);
}
if (mp.size() != 3) return out(-1);
int cnt = 0;
for (auto &it : mp) {
++cnt;
for (auto &u : it.second) {
ans[u] = cnt;
}
}
for (int i = 1; i <= n; ++i)
cout << ans[i] << " \n"[i == n];
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cout << fixed << setprecision(20);
while (cin >> n >> m) run();
return 0;
}
E. Another Filling the Grid
题意:
给出一个\(n \cdot n\)的矩形,每个位置可以填\([1, k]\)。
现在要求每一行至少有一个\(1\),每一列至少有一个\(1\),问填数的方案数。
思路一:
考虑\(f[i][j]\)表示考虑前\(i\)行有\(j\)列有\(1\),转移的时候注意每一行至少有一个\(1\)。
时间复杂度\(O(n^3)\)
代码一:
view code
#include <bits/stdc++.h>
using namespace std;
#define debug(...) { printf("# "); printf(__VA_ARGS__); puts(""); }
#define fi first
#define se second
#define endl "\n"
using ll = long long;
using pII = pair <int, int>;
using pLL = pair <ll, ll>;
using VI = vector <int>;
using VL = vector <ll>;
constexpr int mod = 1e9 + 7;
template <class T1, class T2> inline void chadd(T1 &x, T2 y) { x += y; while (x >= mod) x -= mod; while (x < 0) x += mod; }
template <class T1, class T2> inline void chmax(T1 &x, T2 y) { if (x < y) x = y; }
template <class T1, class T2> inline void chmin(T1 &x, T2 y) { if (x > y) x = y; }
inline int rd() { int x; cin >> x; return x; }
template <class T> inline void rd(T &x) { cin >> x; }
template <class T> inline void rd(vector <T> &vec) { for (auto &it : vec) cin >> it; }
template <class T> inline void out(T s) { cout << s << "\n"; }
template <class T> inline void out(vector <T> &vec) { for (auto &it : vec) cout << it << " "; cout << endl; }
inline ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
inline ll qpow(ll base, ll n) { ll res = 1; while (n) { if (n & 1) res = res * base % mod; base = base * base % mod; n >>= 1; } return res; }
constexpr int N = 300 + 10;
int n, K; ll f[N][N], C[N][N];
void run() {
if (n == 1 || K == 1) return out(1);
memset(f, 0, sizeof f);
for (int i = 1; i <= n; ++i) {
f[1][i] = C[n][i] * qpow(K - 1, n - i) % mod;
}
for (int i = 2; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
ll p = qpow(K, j);
for (int k = j; k <= n; ++k) {
if (k == j) chadd(f[i][k], f[i - 1][j] * (p + mod - qpow(K - 1, j)) % mod * qpow(K - 1, n - k) % mod);
else chadd(f[i][k], f[i - 1][j] * p % mod * C[n - j][k - j] % mod * qpow(K - 1, n - k) % mod);
}
}
}
out(f[n][n]);
}
int main() {
memset(C, 0, sizeof C);
C[0][0] = 1;
for (int i = 1; i < N; ++i) {
C[i][0] = C[i][i] = 1;
for (int j = 1; j < i; ++j)
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
}
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cout << fixed << setprecision(20);
while (cin >> n >> K) run();
return 0;
}
思路二:
考虑枚举有\(i\)行\(j\)列没有\(1\),然后根据\((i + j)\)的奇偶性容斥。
时间复杂度\(O(n^2)\)
代码二:
view code
#include <bits/stdc++.h>
using namespace std;
#define debug(...) { printf("# "); printf(__VA_ARGS__); puts(""); }
#define fi first
#define se second
#define endl "\n"
using ll = long long;
using pII = pair <int, int>;
using pLL = pair <ll, ll>;
using VI = vector <int>;
using VL = vector <ll>;
constexpr int mod = 1e9 + 7;
template <class T1, class T2> inline void chadd(T1 &x, T2 y) { x += y; while (x >= mod) x -= mod; while (x < 0) x += mod; }
template <class T1, class T2> inline void chmax(T1 &x, T2 y) { if (x < y) x = y; }
template <class T1, class T2> inline void chmin(T1 &x, T2 y) { if (x > y) x = y; }
inline int rd() { int x; cin >> x; return x; }
template <class T> inline void rd(T &x) { cin >> x; }
template <class T> inline void rd(vector <T> &vec) { for (auto &it : vec) cin >> it; }
template <class T> inline void out(T s) { cout << s << "\n"; }
template <class T> inline void out(vector <T> &vec) { for (auto &it : vec) cout << it << " "; cout << endl; }
inline ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
inline ll qpow(ll base, ll n) { ll res = 1; while (n) { if (n & 1) res = res * base % mod; base = base * base % mod; n >>= 1; } return res; }
constexpr int N = 300 + 10;
int n, K; ll f[N][N], C[N][N];
void run() {
if (n == 1 || K == 1) return out(1);
ll ans = 0;
//枚举有i行,j列没有1,容斥
for (int i = 0; i <= n; ++i) {
for (int j = 0; j <= n; ++j) {
ll ch = i * n + j * n - i * j;
ll ex = n * n - ch;
ll now = C[n][i] * C[n][j] % mod * qpow(K - 1, ch) % mod * qpow(K, ex) % mod;
if ((i + j) & 1) chadd(ans, mod - now);
else chadd(ans, now);
}
}
out(ans);
}
int main() {
C[0][0] = 1;
for (int i = 1; i < N; ++i) {
C[i][0] = C[i][i] = 1;
for (int j = 1; j < i; ++j)
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
}
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cout << fixed << setprecision(20);
while (cin >> n >> K) run();
return 0;
}
思路三:
考虑枚举至少有\(i\)行没有\(1\),那么保证每一列都至少有一个\(1\),那么答案就是:
\sum\limits_{i = 0}^{n - 1} (-1)^i{n \choose i}(k - 1)^{in}f^n(n - i)
\end{eqnarray*}
\]
其中\(f[i]\)表示有\(i\)个数,至少有一个\(1\)的方案数,显然有:
f[i] = k^{i} - (k - 1)^i
\end{eqnarray*}
\]
时间复杂度\(O(nlogk)\)
代码三:
view code
#include <bits/stdc++.h>
using namespace std;
#define debug(...) { printf("# "); printf(__VA_ARGS__); puts(""); }
#define fi first
#define se second
#define endl "\n"
using ll = long long;
using pII = pair <int, int>;
using pLL = pair <ll, ll>;
using VI = vector <int>;
using VL = vector <ll>;
constexpr int mod = 1e9 + 7;
template <class T1, class T2> inline void chadd(T1 &x, T2 y) { x += y; while (x >= mod) x -= mod; while (x < 0) x += mod; }
template <class T1, class T2> inline void chmax(T1 &x, T2 y) { if (x < y) x = y; }
template <class T1, class T2> inline void chmin(T1 &x, T2 y) { if (x > y) x = y; }
inline int rd() { int x; cin >> x; return x; }
template <class T> inline void rd(T &x) { cin >> x; }
template <class T> inline void rd(vector <T> &vec) { for (auto &it : vec) cin >> it; }
template <class T> inline void out(T s) { cout << s << "\n"; }
template <class T> inline void out(vector <T> &vec) { for (auto &it : vec) cout << it << " "; cout << endl; }
inline ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
inline ll qpow(ll base, ll n) { ll res = 1; while (n) { if (n & 1) res = res * base % mod; base = base * base % mod; n >>= 1; } return res; }
constexpr int N = 300 + 10;
int n, K; ll f[N], C[N][N];
void run() {
if (n == 1 || K == 1) return out(1);
ll ans = 0;
//枚举有i行没有1,然后保证每列至少有一个1,容斥
for (int i = 0; i < n; ++i) {
ll f = (qpow(K, n - i) - qpow(K - 1, n - i) + mod) % mod;
ll now = qpow(f, n) * C[n][i] % mod * qpow(K - 1, n * i) % mod;
if (i & 1) chadd(ans, -now);
else chadd(ans, now);
}
out(ans);
}
int main() {
C[0][0] = 1;
for (int i = 1; i < N; ++i) {
C[i][0] = C[i][i] = 1;
for (int j = 1; j < i; ++j)
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
}
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cout << fixed << setprecision(20);
while (cin >> n >> K) run();
return 0;
}
Codeforces Round #589 (Div. 2)的更多相关文章
- Codeforces Round #589 (Div. 2)-E. Another Filling the Grid-容斥定理
Codeforces Round #589 (Div. 2)-E. Another Filling the Grid-容斥定理 [Problem Description] 在\(n\times n\) ...
- Codeforces Round 589 (Div. 2) 题解
Is that a kind of fetishism? No, he is objectively a god. 见识了一把 Mcdic 究竟出题有多神. (虽然感觉还是吹过头了) 开了场 Virt ...
- Codeforces Round #589 (Div. 2) E. Another Filling the Grid(DP, 组合数学)
链接: https://codeforces.com/contest/1228/problem/E 题意: You have n×n square grid and an integer k. Put ...
- Codeforces Round #589 (Div. 2) D. Complete Tripartite(染色)
链接: https://codeforces.com/contest/1228/problem/D 题意: You have a simple undirected graph consisting ...
- Codeforces Round #589 (Div. 2) C - Primes and Multiplication(数学, 质数)
链接: https://codeforces.com/contest/1228/problem/C 题意: Let's introduce some definitions that will be ...
- Codeforces Round #589 (Div. 2) B. Filling the Grid
链接: https://codeforces.com/contest/1228/problem/B 题意: Suppose there is a h×w grid consisting of empt ...
- Codeforces Round #589 (Div. 2) A. Distinct Digits
链接: https://codeforces.com/contest/1228/problem/A 题意: You have two integers l and r. Find an integer ...
- Codeforces Round #589 (Div. 2) (e、f没写)
https://codeforces.com/contest/1228/problem/A A. Distinct Digits 超级简单嘻嘻,给你一个l和r然后寻找一个数,这个数要满足的条件是它的每 ...
- 【Codeforces Round #589 (Div. 2) D】Complete Tripartite
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 其实这道题感觉有点狗. 思路大概是这样 先让所有的点都在1集合中. 然后随便选一个点x,访问它的出度y 显然tag[y]=2 因为和他相连了嘛 ...
随机推荐
- C++标识符的作用域与可见性
一.标识符的作用域与可见性 作用域讨论的是标识符的有效范围,可见性讨论的是标识符是否可以被引用. 二.作用域 作用域是一个标识符在程序正文中有效的区域.C++中标识符的作用域有函数原型作用域.局部作用 ...
- python练习:面向对象1
面向对象习题: 一:定义一个学生类.有下面的类属性: 1 姓名 2 年龄 3 成绩(语文,数学,英语)[每课成绩的类型为整数] 类方法: 1 获取学生的姓名:get_name() 返回类型:str 2 ...
- java对日开发常用语(词汇)总结
日语 英语 中文 备注 並び順(ならびじゅん) order by 排序 項目(こうもく) field 字段,域 ...
- 使用 rm -rf 删除了工程目录,然后从 pycharm 中找了回来
一次惊险的 rm -rf 操作,以后删东西真的要小心,慢点操作 前两天周 4 周 5,写了两天的 python 代码没有提交,昨天晚上删日志目录,先跨目录查看了下日志目录的列表情况:ll ~/logs ...
- element-ui上传一张图片后隐藏上传按钮
来自:https://github.com/ElemeFE/element/issues/3367#issuecomment-376402380 侵删 el-upload里面绑定一个占位class: ...
- 时间都去哪儿了?开源一个统计iPhone上App运行时间和打开次数的小工具【iOS8已失效】
如今,大家每天都有大量时间花在手机上,但是,大家有没有想过自己的时间都花在哪些App上了呢?相信很多人都有这样的需求,不过iOS系统本身并不能显示每个App的运行时间和次数,因此,本人写了这样一个小工 ...
- OpenStack kilo版(7) 部署dashboard
安装dashboard root@controller:~# apt-get install openstack-dashboard 配置 /etc/openstack-dashboard/loc ...
- c# 字段成员
- [dev][ipsec] 基于路由的VPrivateN
VPrivateN的配置分两个模式 1. 基于策略的VPrivateN ( policy based) 2. 基于路由的VPrivateN (route based) 以strongswan为例, 在 ...
- 【20191118会议】针对华为云CCE 问题总结
针对华为云CCE问题总结 如何购买CCE集群 可以分为测试环境和生产环境,针对使用范围进行购买集群. 测试环境 可以进行公用 生产环境建议使用单独集群 尤其针对部门大 耦合性不高 ,生产环境 建议使用 ...