先嘴炮AC一波,抽空我再去补题2333~~~
A
网络流,理论可以AC。。。
B
思路:统计个数,然后
check
c
h
e
c
k
。主要是写代码的功夫,不犯傻1A没问题。
C
思路:很经典的BFS套路了,写代码的时候要小心一些trick。
D
思路:矩阵快速幂。这道题目有一个很蛋疼的trick,需要先检查数据是否会爆,如果爆的话肯定无解,反之才可能有解。
解法一:根据两个项,跑两次矩阵快速幂求出初项,然后解方程再跑一次矩阵快速幂。
解法二:把较小的项当做第一项,根据
k
k
的大小选择从前向后推或者从后向前推。学弟神奇的思路,倒着搞矩阵快速幂。
E
思路:筛选一下的因子。
F
思路:考虑每个位置对整体的贡献,之后就类似于排列组合了。这里给个代码作为参考。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
LL f[40];
LL Work(LL n) {
LL ans = 0;
if(n >= 0) ans++;
LL m = 1;
LL yu = 0;
int num = 0;
while(n) {
if(n % 10 == 0) {
if(num == 0) {
ans += n / 10;
}
else {
ans += (n / 10 - 1) * m + yu + 1;
}
}
else {
ans += n / 10 * m;
yu = f[num] * (n % 10) + yu;
}
n /= 10; m *= 10;
num++;
}
return ans;
}
int main()
{
int i; f[0] = 1;
for(i = 1; i <= 32; i++) {
f[i] = f[i - 1] * 10;
}
int t, kcase = 1; scanf("%d", &t);
while(t--) {
LL m, n; scanf("%lld%lld", &m, &n);
printf("Case %d: %lld\n", kcase++, Work(n) - Work(m - 1));
}
return 0;
}
G
思路:假设
f[i]
f
[
i
]
为第
i
i
项错排公式。
结果为
H
解法一:
BFS
B
F
S
一下联通块,然后
check
c
h
e
c
k
。
解法二:并查集求出所有的子树,然后
check
c
h
e
c
k
。
I
思路:用线段树来做。因为最多到
1429431
1429431
,而且最初序列是奇数,那么把奇数置
1
1
。之后我们预处理一下所有的lucky number,非lucky number置为,这样线段树维护的就是区间的lucky number总数。对于第
n
n
<script type="math/tex" id="MathJax-Element-13">n</script>个lucky number,可以很轻松的求出来。