第三场选拔赛

先嘴炮AC一波,抽空我再去补题2333~~~

A
网络流,理论可以AC。。。

B
思路:统计个数,然后 check c h e c k 。主要是写代码的功夫,不犯傻1A没问题。

C
思路:很经典的BFS套路了,写代码的时候要小心一些trick。

D
思路:矩阵快速幂。这道题目有一个很蛋疼的trick,需要先检查数据是否会爆,如果爆的话肯定无解,反之才可能有解。

解法一:根据两个项,跑两次矩阵快速幂求出初项,然后解方程再跑一次矩阵快速幂。
解法二:把较小的项当做第一项,根据 k k 的大小选择从前向后推或者从后向前推。学弟神奇的思路,倒着搞矩阵快速幂。

E
思路:筛选一下 PL P − L 的因子。

F
思路:考虑每个位置对整体的贡献,之后就类似于排列组合了。这里给个代码作为参考。

#include 
#include 
#include 
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 项错排公式。
结果为 Ckmnmi=0f[mk+i]Cinm C m k ∗ ∑ i = 0 n − m f [ m − k + i ] ∗ C n − m 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置为 0 0 ,这样线段树维护的就是区间的lucky number总数。对于第 n n 个lucky number,可以很轻松的求出来。

你可能感兴趣的:(Contest)