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;
}

浙公网安备 33010602011771号