cf868 (div2)
A
- 求解一元二次方程
#include <bits/stdc++.h>
using namespace std;
int main(){
int t,n,k; cin >> t;
while(t--){
cin >> n >> k;
int x = 0 - n * n + 2 * n + 4 * k;
if(x<0){
cout << "NO" << endl;
continue;
}
else{
bool flag = false;
int index;
for(int i = 0; i*i <= x;i++){
if(i*i == x){
flag = true;
index = i;
}
}
if(!flag){
cout << "NO" << endl;
continue;
}
else{
int x1 = n + index;
int x2 = n - index;
if(x1%2==0){
cout << "YES"<< endl;
int xx1 = x1/2;
for(int i = 1; i <= xx1;i++){
cout << -1 << " ";
}
for(int i = xx1+1; i <= n;i++){
cout << 1 << " ";
}
cout << endl;
}
else {
cout << "NO" << endl;
}
}
}
}
}
B
- 找其中的规律 v[i] - (i+1),分类讨论
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
ios::sync_with_stdio(false),cin.tie(0);
int t; cin >> t;
while(t--){
int n,k; cin >> n >> k;
vector<int>v(n),b(n);
int cnt = 0;
for(int i = 0; i < n;i++){
cin >> v[i];
b[i] = abs(v[i] - (i+1));
// cout << b[i] << " -";
if(b[i]%k!=0){
++cnt;
}
}
if(cnt==0){
cout << cnt << endl;
}
else if(cnt <= 2){
cout << 1 << endl;
}
else{
cout << -1 << endl;
}
}
}
C
- 素数筛找出每一个因数的质因数,根据 质因数的指数 是否 是 2的倍数,质因数剩余个数是否是1的倍数,计算,很容易计算出来
以下是一个求解过程的示例代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 1e7 + 5;
int prime[MAXN];
bool is_prime[MAXN];
void sieve(int n) {
int cnt = 0;
fill(is_prime, is_prime + n + 1, true); // 初始化为 true
is_prime[0] = is_prime[1] = false; // 0 和 1 不是质数
for (int i = 2; i <= n; i++) {
if (is_prime[i]) {
prime[cnt++] = i; // 记录质数
}
for (int j = 0; j < cnt && i * prime[j] <= n; j++) {
is_prime[i * prime[j]] = false; // 标记合数
if (i % prime[j] == 0) {
break; // i * prime[j+1] 已经被标记过了
}
}
}
}
vector<int> count_prime_factors(int x) {
vector<int>res;
int cnt = 0;
for (int i = 0; prime[i] * prime[i] <= x; i++) {
if (x % prime[i] == 0) {
while (x % prime[i] == 0) {
x /= prime[i];
res.push_back(prime[i]);
}
}
}
if (x > 1) {
res.push_back(x);
}
return res;
}
signed main(){
ios::sync_with_stdio(false),cin.tie(0);
sieve(MAXN);
// cout << count_prime_factors(1080) << endl;
int t; cin >> t;
while(t--){
int n; cin >> n;
int x;
int ans = 0,ans1 = 0;
map<int,int>mp;
for(int i = 1; i <=n;i++){
cin >> x;
vector<int>temp = count_prime_factors(x);
for(auto it:temp){
mp[it]++;
}
}
vector<int>V;
for(auto it:mp){
V.push_back(it.second);
}
sort(V.begin(),V.end());
if(V.size()<=2&&V.back()==1){
cout << 0 << endl;
continue;
}
int cnt1 =0,cnt2 =0;
for(auto v:V){
cnt1 += (v>>1);
cnt2 += (v&1);
}
cout << cnt1 + cnt2/3 << endl;
}
}
D
可以先拼接’a’,接着abc 通过拼接,如果遇到需要增加的,让 ‘c’ ++, 即可,
#include <bits/stdc++.h>
using namespace std;
int main(){
// char q = 'c' + 27 ;
// cout << q << endl;
int t; cin >> t;
while(t--){
int n,k; cin >> n >> k;
vector<int>x(k+1),c(k+1);
for(int i =1; i <= k;i++) cin >> x[i];
for(int i =1; i <= k;i++) cin >> c[i];
bool flag = false;
for(int i = 1; i <k;i++){
if(c[i+1]-c[i] > x[i+1]-x[i]){
flag = true;
}
}
if(c[0]>x[0]){
flag = true;
}
if(flag){
cout << "NO" << endl;
continue;
}
vector<char>ans;
int cnt = 0;
for(int j = 1; j <=k;j++){
if(j==1){
for(int i = 0; i < c[1]-3;i++){
ans.push_back('a');
}
for(int i = c[1]-3; i < x[1];i++){
if('a'+cnt=='d') cnt = 0;
ans.push_back('a' + cnt);
cnt++;
}
}
else{
int d1 = c[j] - c[j-1];
for(int i = 0; i < d1;i++){
ans.push_back('c'+j);
}
for(int i = d1; i < x[j]-x[j-1];i++){
if('a'+cnt=='d') cnt = 0;
ans.push_back('a' + cnt);
cnt++;
}
}
}
cout << "YES" << endl;
for(auto it:ans){
cout << it <<"";
}
cout << endl;
}
}