Codeforces Round #538 (Div. 2)原题记

Codeforces Round #538 (Div. 2)原题记

B题看晕了,C题神仙数论题。

无意点开luogu,发现C题原来是原题。

1h30min左右抄了题解交了上去,没想到还能涨一点rating。。。

A

直接模拟就是了。我懒得再看一次题面。

#include<bits/stdc++.h>
using std::cin;
using std::cout;
using std::endl;
#define ll long long
int x, y, z, a, b, c;
int main() {
    cin >> x >> y >> z >> a >> b >> c;
    if(x > a) {
        cout << "NO" << endl;
        return 0;
    }
    a -= x;
    int sum = a + b;
    if(y > sum) {
        cout << "NO" << endl;
        return 0;
    }
    sum = sum - y + c;
    if(z > sum) {
        cout << "NO" << endl;
        return 0;
    }
    cout << "YES" << endl;
    return 0;
}

B

这道题有点东西,我乱搞还是WA了。

题解说有结论:其实前\(m \times k\)大的数字全都能取到。

接下来就是考虑如何写出方案:

我们利用离散化的方法,记录值和下标。先按值从大到小排序,然后取前\(m\times k\)个。

取到的再按下标从小到大排序,每隔\(m\)个就断开,也就是输出这个下标。

就这么做完了。。。

并不知道这个结论啊啊啊

/*************************************************************************
 @Author: Garen
 @Created Time : Mon 11 Feb 2019 07:49:40 PM CST
 @File Name: CF1114B.cpp
 @Description:
 ************************************************************************/
#include<bits/stdc++.h>
using std::cin;
using std::cout;
using std::endl;
#define ll long long
const ll maxn = 200005;
std::pair<int,int> a[maxn];
ll idx[maxn];
ll n, m, k;
ll ans;
std::vector<int> answers;
int main() {
    cin >> n >> m >> k;
    for(ll i = 1; i <= n; i++) {
        cin >> a[i].first; a[i].second = i;
    }
    std::sort(a + 1, a + n + 1, std::greater<std::pair<int,int>>());

    for(ll i = 1; i <= m * k; i++) {
        ans += a[i].first;
        idx[i] = a[i].second;
    }
    std::sort(idx + 1, idx + m * k + 1);
    for(ll i = 1; i < k; i++) {
        answers.push_back(idx[i * m]);
    }
    cout << ans << endl;
    for(auto it: answers) cout << it << ' ';
    cout << endl;
    return 0;
}

C

原题:P3927 SAC E#1 - 一道中档题 Factorial

题意:求\(n!\)\(b\)进制下末尾有连续多少个\(0\)

手摸几下,就会发现:\(n!\)能够除\(b\)多少次,\(b\)进制末尾就有连续多少个\(0\)

所以问题转换为:求\(n!\)能连续除\(b\)的次数。

我们把\(k\)分解质因数,然后看\(n!\)包含多少个质因数,求完这个个数后再除以在\(k\)里面质因数的指数,最后的答案就是这些数的最小值。

然后问题又转换为:求\(n!\)包含某个质因数\(i\)的个数。

\(n!\)展开后,显然每\(i\)个数里面一定有个\(i\),这\(i\)\(i\)里面也一定有个\(i\)。以此类推就可以求了。(有点绕)

看看代码8,说不下去了:

/*************************************************************************
 @Author: Garen
 @Created Time : Tue 19 Feb 2019 02:25:33 PM CST
 @File Name: P3927.cpp
 @Description:
 ************************************************************************/
#include<bits/stdc++.h>
using std::cin;
using std::cout;
using std::endl;
#define ll long long
const ll maxn = 100005;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll a[maxn], b[maxn], tot;
ll n, k;

int main() {
    cin >> n >> k;
    // 正宗的分解质因数过程,要记牢啊
    for(ll i = 2; i * i <= k; i++) {
        if(k % i == 0) {
            a[++tot] = i;
        }
        while(k % i == 0) {
            b[tot]++; k /= i;
        }
    }
    if(k > 1) {
        a[++tot] = k; b[tot] = 1;
    }
    // 分解质因数到此为止
    ll ans = INF;
    for(ll i = 1; i <= tot; i++) {
        ll temp = n, cnt = 0;
        while(temp) {
            temp /= a[i];
            cnt += temp;
        }
        cnt /= b[i];
        ans = std::min(ans, cnt);
    }
    cout << ans << endl;
    return 0;
}

后面的题目

没有

posted @ 2019-02-19 21:50  Garen-Wang  阅读(155)  评论(0编辑  收藏  举报