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. D Dandan's lunch

    链接:https://ac.nowcoder.com/acm/contest/338/D来源:牛客网 题目描述 As everyone knows, there are now n people pa ...

  2. javaweb各种框架组合案例(四):maven+spring+springMVC+spring data jpa(hibernate)【失败案例】

    一.失败案例 1. 控制台报错信息 严重: Exception sending context initialized event to listener instance of class org. ...

  3. Django 配置 qq 邮箱发送邮件

    目录 一.实验环境 二.获取QQ邮箱授权码 1.什么是授权码? 2.怎么获取授权码? 三.Django中配置 setting.py中添加如下代码 文本邮件 HTML 邮件 一.实验环境 Python3 ...

  4. 从__name__=='__main__'说到__builtin__

    一.__name__ 我们在写好代码进行自测的时候一般会先写这样一行代码: # inter_method if __name__ == '__main__': 为什么呢,可能并不是所有人都考虑过,这个 ...

  5. java 继承访问成员变量

    package java09; //创建父类 public class Fu { int numFu = 10; int num =100; public void methodFu(){ Syste ...

  6. java Scanner输入数字、字符串

    package java05; import java.util.Scanner;//1.导包 /* Scanner类的功能,可以实现键盘输入数据,到程序当中 引用类型的一班使用步骤: 1.导包 2. ...

  7. ubuntu在线搭建ftp服务器

    转载:https://www.linuxidc.com/Linux/2016-12/138563.htm 在Linux中ftp服务器的全名叫 vsftpd,我们需要利用相关命令来开启安装ftp服务器, ...

  8. Morphia开发简介

    1. 什么是Morphia Morphia是一个开放源代码的对象关系映射框架,它对MongoDB数据库 java版驱动进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵 ...

  9. hdu 1506:Largest Rectangle in a Histogram 【单调栈】

    题目链接 对栈的一种灵活运用吧算是,希望我的注释写的足够清晰.. #include<bits/stdc++.h> using namespace std; typedef long lon ...

  10. 英语单词profile

    profile 来源——linux系统文件名 [root@centos71 ~]# cat /etc/profile # /etc/profile # System wide environment ...