A

题意

求\(l \le x \le r\)的所有数位不同的数\(x\), 任意输出一个.

\(1 \leq l \leq r \leq 10 ^5\)

Solution

按照题意模拟即可.

#include <bits/stdc++.h>

using namespace std;
#define rep(i, a, b) for (int i = (a), i##_end_ = (b); i <= i##_end_; ++i)
#define drep(i, a, b) for (int i = (a), i##_end_ = (b); i >= i##_end_; --i)
#define clar(a, b) memset((a), (b), sizeof(a))
#define debug(...) fprintf(stderr, __VA_ARGS__)
template <typename T> bool chkmax(T &a, const T &b) { return a < b ? a = b, true : false; }
template <typename T> bool chkmin(T &a, const T &b) { return a > b ? a = b, true : false; }
template <typename T> T getSign(const T&a) { return (a > T(0)) - (a < T(0)); }
typedef long long LL;
typedef long double LD;
const double pi = acos(-1);
void procStatus() {
ifstream t("/proc/self/status");
cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>()) << endl;
}
int read() {
int x = 0, flag = 1;
char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') flag *= -1;
for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
return x * flag;
}
void write(LL x) {
if (x < 0) putchar('-'), x = -x;
if (x >= 10) write(x / 10);
putchar(x % 10 + '0');
} int l, r;
void Init() {
l = read(), r = read();
} bool check(int val) {
static int tmp[20], cnt; cnt = 0;
while (val)
tmp[++cnt] = val % 10, val /= 10;
sort(tmp + 1, tmp + cnt + 1);
return cnt == unique(tmp + 1, tmp + cnt + 1) - (tmp + 1);
} void Solve() {
rep (i, l, r)
if (check(i)) {
printf("%d\n", i);
exit(0);
}
puts("-1");
} int main() {
// freopen("bosky.in", "r", stdin);
// freopen("bosky.out", "w", stdout); Init();
Solve(); #ifdef Qrsikno
debug("\nRunning time: %.3lf(s)\n", clock() * 1.0 / CLOCKS_PER_SEC);
#endif
return 0;
}

B

题意

有一个被黑白染色的\(h \times w\)的网格, 定义\(r_i\)表示从上到下第i行\([1, r_i] \cap N^+\)全部是黑色, 并且第i行\(r_i + 1\)为白色(如果该位置在网格内), 定义\(c_i\)表示从左到右第i列\([1, c_i] \cap N^+\)全部是黑色, 并且第i列\(c_i + 1\)为白色(如果该位置在网格内), 其他位置的情况不清楚.

给定\(h, w, r_i, c_i\)求满足条件的网格方案数, 答案对\(10^9 + 7\)取模的答案.

Solution

在矩阵上打标记, 没有被打标记的地方随便填, 这部分对答案的贡献是\(2 ^{cnt}\)

注意可能给出的矩阵本身不合法.

#include <bits/stdc++.h>

using namespace std;
#define rep(i, a, b) for (int i = (a), i##_end_ = (b); i <= i##_end_; ++i)
#define drep(i, a, b) for (int i = (a), i##_end_ = (b); i >= i##_end_; --i)
#define clar(a, b) memset((a), (b), sizeof(a))
#define debug(...) fprintf(stderr, __VA_ARGS__)
template <typename T> bool chkmax(T &a, const T &b) { return a < b ? a = b, true : false; }
template <typename T> bool chkmin(T &a, const T &b) { return a > b ? a = b, true : false; }
template <typename T> T getSign(const T&a) { return (a > T(0)) - (a < T(0)); }
typedef long long LL;
typedef long double LD;
const double pi = acos(-1);
void procStatus() {
ifstream t("/proc/self/status");
cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>()) << endl;
}
int read() {
int x = 0, flag = 1;
char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') flag *= -1;
for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
return x * flag;
}
void write(LL x) {
if (x < 0) putchar('-'), x = -x;
if (x >= 10) write(x / 10);
putchar(x % 10 + '0');
} const int Maxn = 3009, Mod = 1e9 + 7;
int h, w, r[Maxn], c[Maxn]; void Init() {
h = read(), w = read();
rep (i, 1, h) r[i] = read();
rep (i, 1, w) c[i] = read();
} int vis[Maxn][Maxn], col[Maxn][Maxn]; bool judge() {
int flag = 1;
rep (i, 1, h) {
if (r[i] == 0)
flag &= (!col[i][1]);
else
if (r[i] != w) flag &= (col[i][r[i]] && !col[i][r[i] + 1]);
}
if (!flag) return 0;
rep (i, 1, w) {
if (c[i] == 0)
flag &= (!col[1][i]);
else if (c[i] != h) flag &= (col[c[i]][i] && !col[c[i] + 1][i]);
}
return flag;
} void Solve() {
rep (i, 1, h)
rep (j, 1, r[i] + 1) vis[i][j] = 1;
rep (i, 1, w)
rep (j, 1, c[i] + 1) vis[j][i] = 1;
rep (i, 1, h)
rep (j, 1, r[i]) col[i][j] = 1;
rep (i, 1, w)
rep (j, 1, c[i]) col[j][i] = 1; if (!judge()) {
cout << 0 << endl;
return ;
}
int cnt = h * w;
rep (i, 1, h)
rep (j, 1, w) cnt -= vis[i][j];
int ans = 1;
rep (i, 1, cnt) ans = (ans << 1) % Mod;
cout << ans << endl;
} int main() {
// freopen("bosky.in", "r", stdin);
// freopen("bosky.out", "w", stdout); Init();
Solve(); #ifdef Qrsikno
debug("\nRunning time: %.3lf(s)\n", clock() * 1.0 / CLOCKS_PER_SEC);
#endif
return 0;
}

C

题意

定义\(prime(x)\)表示x因子中的质数形成的集合(\(prime(140)=\{2,7,5\}\)), \(g(x, p)\)表示整除\(x\)的最大的质数\(p\)的次幂(\(g(45, 3) = 3^2, g(100, 3) = 3^0\)), $f(x, y) = \prod_{p \in prime(x)} g(y, p) $.

现在给定\(x, n\), 计算\(\prod_{i = 1}^{n} g(x, i) \pmod {1e9 + 7}\)

\(x \leq 10^9, n \leq 10^{18}\)

Solution

考虑每个x的质因子的贡献, 对于一个质因子\(p\), \(p\)的倍数会因为\(p\)被算一次, \(p^2\)的倍数会因为\(p^2\)被算一次.

将\(x\)质因数分解, 暴力枚举每个质数的幂计算, 注意可能最后一次计算质数的幂会爆\(LL\)

#include <bits/stdc++.h>

using namespace std;
#define rep(i, a, b) for (int i = (a), i##_end_ = (b); i <= i##_end_; ++i)
#define drep(i, a, b) for (int i = (a), i##_end_ = (b); i >= i##_end_; --i)
#define clar(a, b) memset((a), (b), sizeof(a))
#define debug(...) fprintf(stderr, __VA_ARGS__)
template <typename T> bool chkmax(T &a, const T &b) { return a < b ? a = b, true : false; }
template <typename T> bool chkmin(T &a, const T &b) { return a > b ? a = b, true : false; }
template <typename T> T getSign(const T&a) { return (a > T(0)) - (a < T(0)); }
typedef long long LL;
typedef long double LD;
const double pi = acos(-1);
void procStatus() {
ifstream t("/proc/self/status");
cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>()) << endl;
}
LL read() {
LL x = 0, flag = 1;
char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') flag *= -1;
for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
return x * flag;
}
void write(LL x) {
if (x < 0) putchar('-'), x = -x;
if (x >= 10) write(x / 10);
putchar(x % 10 + '0');
} const int Mod = 1e9 + 7; LL x, n;
void Init() {
x = read(), n = read();
} vector <LL> divs; int fpm(int base, LL tims) {
tims %= (Mod - 1);
int r = 1;
while (tims) {
if (tims & 1) r = 1ll * base * r % Mod;
base = 1ll * base * base % Mod;
tims >>= 1;
}
return r;
} void Solve() {
rep (i, 2, sqrt(x))
if (x % i == 0) {
divs.push_back(i);
while (x % i == 0) x /= i;
}
if (x != 1) divs.push_back(x);
LL ans = 1;
rep (i, 0, divs.size() - 1) {
LL val = divs[i], cnt = 0;
while (val <= n) {
cnt += n / val;
if (n / divs[i] < val) break;
val = val * divs[i];
}
ans = 1ll * ans * fpm(divs[i], cnt) % Mod;
}
cout << ans << endl;
} int main() {
// freopen("bosky.in", "r", stdin);
// freopen("bosky.out", "w", stdout); Init();
Solve(); #ifdef Qrsikno
debug("\nRunning time: %.3lf(s)\n", clock() * 1.0 / CLOCKS_PER_SEC);
#endif
return 0;
}

D

题意

给你一个\(n\)个点\(m\)条边的图, 要求进行三分图染色, 要求三种颜色每种颜色的点都向另外两种颜色的所有点连边, 颜色内部没有边, 不能没有点不被染色, 必须要有三种颜色出现.

给出一种合法方案或判定无解.

\(n \leq 10^5\), \(m \leq 3e5\)

Solution

随便选取一个点, 与之相邻的必定是2/3色, 与之不相邻的必定是1色, 调整与之相邻的点的状态, 如果无法调整判定无解, 还要判定一些别的部分, 详见代码.

#include <bits/stdc++.h>

using namespace std;
#define rep(i, a, b) for (int i = (a), i##_end_ = (b); i <= i##_end_; ++i)
#define drep(i, a, b) for (int i = (a), i##_end_ = (b); i >= i##_end_; --i)
#define clar(a, b) memset((a), (b), sizeof(a))
#define debug(...) fprintf(stderr, __VA_ARGS__)
template <typename T> bool chkmax(T &a, const T &b) { return a < b ? a = b, true : false; }
template <typename T> bool chkmin(T &a, const T &b) { return a > b ? a = b, true : false; }
template <typename T> T getSign(const T&a) { return (a > T(0)) - (a < T(0)); }
typedef long long LL;
typedef long double LD;
const double pi = acos(-1);
void procStatus() {
ifstream t("/proc/self/status");
cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>()) << endl;
}
LL read() {
LL x = 0, flag = 1;
char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') flag *= -1;
for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
return x * flag;
}
void write(LL x) {
if (x < 0) putchar('-'), x = -x;
if (x >= 10) write(x / 10);
putchar(x % 10 + '0');
} const int Mod = 1e9 + 7; LL x, n;
void Init() {
x = read(), n = read();
} vector <LL> divs; int fpm(int base, LL tims) {
tims %= (Mod - 1);
int r = 1;
while (tims) {
if (tims & 1) r = 1ll * base * r % Mod;
base = 1ll * base * base % Mod;
tims >>= 1;
}
return r;
} void Solve() {
rep (i, 2, sqrt(x))
if (x % i == 0) {
divs.push_back(i);
while (x % i == 0) x /= i;
}
if (x != 1) divs.push_back(x);
LL ans = 1;
rep (i, 0, divs.size() - 1) {
LL val = divs[i], cnt = 0;
while (val <= n) {
cnt += n / val;
if (n / divs[i] < val) break;
val = val * divs[i];
}
ans = 1ll * ans * fpm(divs[i], cnt) % Mod;
}
cout << ans << endl;
} int main() {
// freopen("bosky.in", "r", stdin);
// freopen("bosky.out", "w", stdout); Init();
Solve(); #ifdef Qrsikno
debug("\nRunning time: %.3lf(s)\n", clock() * 1.0 / CLOCKS_PER_SEC);
#endif
return 0;
}

E

题意

给定\(n, k\), 要求给\(n \times n\)的网格填数$ \in [1, k] \cap N^+$,要求每行每列至少出现一个1.

\(n \leq 250, k \leq 10^9\)

Bonus: \(n \leq 10^5\)

Solution

正解给的做法是Dp.

设\(Dp[i][j]\)表示我填完了前\(i\)行, 现在还有j个列没有给\(1\).

转移分两种: 1. 在j个里面选一些填1; 2. 在n - j里面选一些填入1.

然后就是:

  1. \[dp[i + 1][l] \leftarrow dp[i][j] {j \choose l} (k - 1)^l k^{n - j}$$;

    \]

预处理组合数和幂就可以做到\(O(n^3)\)

还有一种容斥做法:

设性质\(P_{j}\)表示第\(j\)个位置满足条件(j <= n, 为行, j > n为列):

\[\begin{aligned}
Ans &= \sum_{i = 0}^{n} \sum_{j = 0}^{n} (-1)^{i + j}{n \choose i}{n \choose j}k^{n^2 - (i + j)n + ij}(k - 1)^{(i + j)n-ij} \\
&= \sum_{i = 0}^{n} \sum_{j = 0}^{n} (-1)^{i}(-1)^{j}{n \choose i}{n \choose j}k^{(n - i)(n - j)}(k - 1)^{j(n - i) + ni}\\
&= \sum_{i = 0}^{n}(-1)^{i}{n \choose i}(k - 1)^{ni} \sum_{j = 0}^{n} {n \choose j}(k^{n -i})^{n - j}{(-(k - 1)^{n - i})}^{j} \\
&= \sum_{i = 0}^{n}(-1)^{i}{n \choose i}(k - 1)^{ni} (k^{n-i} -(k - 1)^{n - i})^n
\end{aligned}
\]

去掉快速幂的复杂度就是O(n)的.

#include <bits/stdc++.h>

using namespace std;
#define rep(i, a, b) for (int i = (a), i##_end_ = (b); i <= i##_end_; ++i)
#define drep(i, a, b) for (int i = (a), i##_end_ = (b); i >= i##_end_; --i)
#define clar(a, b) memset((a), (b), sizeof(a))
#define debug(...) fprintf(stderr, __VA_ARGS__)
template <typename T> bool chkmax(T &a, const T &b) { return a < b ? a = b, true : false; }
template <typename T> bool chkmin(T &a, const T &b) { return a > b ? a = b, true : false; }
template <typename T> T getSign(const T&a) { return (a > T(0)) - (a < T(0)); }
typedef long long LL;
typedef long double LD;
const double pi = acos(-1);
void procStatus() {
ifstream t("/proc/self/status");
cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>()) << endl;
}
LL read() {
LL x = 0, flag = 1;
char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') flag *= -1;
for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
return x * flag;
}
void write(LL x) {
if (x < 0) putchar('-'), x = -x;
if (x >= 10) write(x / 10);
putchar(x % 10 + '0');
} const int Maxn = 300, Mod = 1e9 + 7;
int n, k, power1[Maxn], power2[Maxn];
int fac[Maxn], _inv[Maxn], invFac[Maxn]; void Init() {
n = read(), k = read();
power1[0] = power2[0] = 1;
rep (i, 1, n) {
power1[i] = power1[i - 1] * (k - 1ll) % Mod;
power2[i] = power2[i - 1] * 1ll * k % Mod;
}
fac[0] = 1;
rep (i, 1, n) fac[i] = fac[i - 1] * 1ll * i % Mod;
_inv[1] = 1;
rep (i, 2, n) _inv[i] = 1ll * _inv[Mod % i] * (Mod - Mod / i) % Mod;
invFac[0] = 1;
rep (i, 1, n)
invFac[i] = invFac[i - 1] * 1ll * _inv[i] % Mod;
} inline int C(int _n, int _m) {
if (_n < _m) return 0;
return 1ll * fac[_n] * invFac[_m] % Mod * invFac[_n - _m] % Mod;
} void Solve() {
static int dp[Maxn][Maxn]; dp[0][n] = 1;
rep (i, 0, n)
rep (j, 0, n) {
if (dp[i][j] == 0) continue;
rep (l, 0, j - 1) {
dp[i + 1][l] += dp[i][j] * 1ll * C(j, l) % Mod * power1[l] % Mod * power2[n - j] % Mod;
if (dp[i + 1][l] >= Mod) dp[i + 1][l] -= Mod;
}
if (j)
rep (l, 1, n - j) {
dp[i + 1][j] += dp[i][j] * 1ll * C(n - j, l) % Mod * power1[n - l] % Mod;
if (dp[i + 1][j] >= Mod) dp[i + 1][j] -= Mod;
}
if (j == 0)
rep (l, 1, n) {
dp[i + 1][0] += dp[i][0] * 1ll * C(n, l) % Mod * power1[n - l] % Mod;
if (dp[i + 1][0] >= Mod) dp[i + 1][0] -= Mod;
}
}
cout << dp[n][0] << endl;
} int main() {
freopen("bosky.in", "r", stdin);
freopen("bosky.out", "w", stdout); Init();
Solve(); #ifdef Qrsikno
debug("\nRunning time: %.3lf(s)\n", clock() * 1.0 / CLOCKS_PER_SEC);
#endif
return 0;
}

F

[CF1228] 简要题解的更多相关文章

  1. Noip 2014酱油记+简要题解

    好吧,day2T1把d默认为1也是醉了,现在只能期待数据弱然后怒卡一等线吧QAQ Day0 第一次下午出发啊真是不错,才2小时左右就到了233,在车上把sao和fate补掉就到了= = 然后到宾馆之后 ...

  2. Tsinghua 2018 DSA PA2简要题解

    反正没时间写,先把简要题解(嘴巴A题)都给他写了记录一下. upd:任务倒是完成了,我也自闭了. CST2018 2-1 Meteorites: 乘法版的石子合并,堆 + 高精度. 写起来有点烦貌似. ...

  3. Codeforces 863 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 简要题解?因为最后一题太毒不想写了所以其实是部分题解... A题 传送门 题意简述:给你一个数,问你能不能通过加前导000使其成为一个回文数 ...

  4. HNOI2018简要题解

    HNOI2018简要题解 D1T1 寻宝游戏 题意 某大学每年都会有一次 Mystery Hunt 的活动,玩家需要根据设置的线索解谜,找到宝藏的位置,前一年获胜的队伍可以获得这一年出题的机会. 作为 ...

  5. JXOI2018简要题解

    JXOI2018简要题解 T1 排序问题 题意 九条可怜是一个热爱思考的女孩子. 九条可怜最近正在研究各种排序的性质,她发现了一种很有趣的排序方法: Gobo sort ! Gobo sort 的算法 ...

  6. BJOI2018简要题解

    BJOI2018简要题解 D1T1 二进制 题意 pupil 发现对于一个十进制数,无论怎么将其的数字重新排列,均不影响其是不是 \(3\) 的倍数.他想研究对于二进制,是否也有类似的性质. 于是他生 ...

  7. CQOI2018简要题解

    CQOI2018简要题解 D1T1 破解 D-H 协议 题意 Diffie-Hellman 密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码)的情况下,通过不安全的信 ...

  8. AtCoder ExaWizards 2019 简要题解

    AtCoder ExaWizards 2019 简要题解 Tags:题解 link:https://atcoder.jp/contests/exawizards2019 很水的一场ARC啊,随随便便就 ...

  9. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

随机推荐

  1. [fw]拦截系统调用

    今天在ubuntu中玩了下“拦截系统调用”,记录下自己对整个实现的理解. 原理 在linux kernel中,系统调用都放在一个叫做“sys_call_table”的分配表里面,在进入一个系统调用的最 ...

  2. SELECT COUNT语句

    数据库查询相信很多人都不陌生,所有经常有人调侃程序员就是CRUD专员,这所谓的CRUD指的就是数据库的增删改查. 在数据库的增删改查操作中,使用最频繁的就是查询操作.而在所有查询操作中,统计数量操作更 ...

  3. C#使用Process启动exe程序,不弹出控制台窗口的方法

    背景:使用wkhtmltopdf工具将html转换成pdf时,这个工具在进行转换时会弹出命令行窗口显示转换过程,但是在项目运行时弹出服务器突然弹出控制台窗口会很奇怪,尤其是当转换多个时.解决这个问题 ...

  4. SharePoint创建web应用程序,提示密码不正确

    使用版本SharePoint2010: $username="domain\username"$newpassword="xxxxxxxx"stsadm -o ...

  5. Git 常用命令简单记录

    分布式版本控制系统,跟踪文本文件的改动 ubuntu安装: sudo apt install git 安装完成后,设置使用的用户名和邮箱: 全局: git config --global user.n ...

  6. 【Leetcode周赛】从contest-81开始。(一般是10个contest写一篇文章)

    Contest 81 (2018年11月8日,周四,凌晨) 链接:https://leetcode.com/contest/weekly-contest-81 比赛情况记录:结果:3/4, ranki ...

  7. 同步与异步,阻塞与非阻塞 bio,nio,aio

    BIO.NIO和AIO的区别(简明版) 同步异步,阻塞非阻塞: https://www.zhihu.com/question/19732473   转载请注明原文地址:http://www.cnblo ...

  8. RBAC用户权限管理数据库设计的图文详解

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

  9. Flutter-ListView

    return Container( child: ListView( children: <Widget>[ Column( children: <Widget>[ Conta ...

  10. python基础:3.高级运算符

    1.异或运算 十进制的异或运算,先转成二进制进行异或,按位进行比较,对应位置相同则为0,对应位置不同则为1,,再从异或结果转成十进制. python中: 1 ^ 1 = 0 1 ^ 2 = 3 1 ^ ...