Codeforces Round #725 (Div. 3)

D. Another Problem About Dividing Numbers

【思路】
首先将k=1的情况特判,这种情况只有a%b=0或者b%a=0而且a!=b时才能满足条件
然后观察a、b两个数都可以被除到1,将a,b两个数进行质因数分解,分解出的质因数个数之和为sum,如果sum>=k则输出YES,否则输出NO

/*
 * @Author: Ykui.Chen 
 * @Date: 2021-08-12 17:22:11 
 * @Last Modified by: Ykui.Chen
 * @Last Modified time: 2021-08-12 18:30:34
 */
#include <bits/stdc++.h>
#define IOS                  \
    ios::sync_with_stdio(0); \
    cin.tie(0);              \
    cout.tie(0);
inline int read() {
    int X = 0, w = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')
            w = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') X = (X << 3) + (X << 1) + ch - '0', ch = getchar();
    return X * w;
}
#define ll long long
using namespace std;
const ll maxn = 1e5 + 7;
bool number[maxn + 5];
ll prime[maxn + 5];
ll c = 0;
void isprime() {
    int i, j;
    memset(number, true, sizeof(number));
    for (i = 2; i <= maxn; i++) {
        if (number[i])
            prime[c++] = i;
        for (j = 0; j < c && prime[j] * i <= maxn; j++) {
            number[prime[j] * i] = false;
            if (i % prime[j] == 0)  //保证每个合数只会被它的最小质因数筛去,因此每个数只会被标记一次
                break;
        }
    }
}
ll cal(ll x) {
    ll num = 0;
    for (ll i = 0; i < c; i++) {
        if (x % prime[i] == 0) {
            while (x % prime[i] == 0) {
                num++;
                x /= prime[i];
            }
        }
    }
    if (x > 1)
        num++;
    return num;
}
int main() {
    IOS
    isprime();
    ll t;
  cin>>t;
    while (t--) {
        ll a, b, k;
        cin>>a>>b>>k;
        ll num1 = 0, num2 = 0;
        num1 = cal(a);
        num2 = cal(b);
        ll sum = num1 + num2;
        if (k == 1) {
            if (a % b == 0 || b % a == 0) {
                if (a != b) {
                    puts("YES");
                } else
                    puts("NO");
            } else
                puts("NO");
        } else {
            if (k <= sum) {
                puts("YES");
            } else
                puts("NO");
        }
    }
    return 0;
}

这里有一个困扰了我很久的点,就是要先用素数筛,筛出质数,在用到质因数分解中,否则会超时

F. Interesting Function

【思路】
将l到r之间的数量转换为[0,r]-[0,l]
计算每一位的贡献

#include <bits/stdc++.h>
#define int long long
using namespace std;

int cal(int x) {
    int ans = 0;
    while (x) {
        ans += x;
        x /= 10;
    }
    return ans;
}
int main() {
    int t;
    cin >> t;
    while (t--) {
        int l, r;
        cin >> l >> r;
        int ans = cal(r) - cal(l);
        cout << ans << endl;
    }
    return 0;
}
posted @ 2021-08-12 19:03  DurKui  阅读(41)  评论(0)    收藏  举报