codeforces868 (div2)

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;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

savkACUNCB: IOnjn

欢迎来到我的世界

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值