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;
}
后面的题目
没有