A. 简单的分类讨论+基础数论

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

int calc(int x, int y){
    int mod = x%5;
    if(mod == 0 && x>=1) 
        return 0;
    
    int c1=INT_MAX, c2=INT_MAX;
    if(x-mod >= 1)
        c1 = mod;
    int nowx = x+(5-mod);
    if(nowx >= 1){
        int tmp = 5-mod;
        if(nowx > y)
            tmp += nowx-y;
        c2 = tmp;
    }

    return min(c1, c2);
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    int T;
    cin >> T;
    while(T--){
        int x, y;
        cin >> x >> y;
        cout << calc(x, y) << "\n";
    }

    return 0;
}

B. 字符串匹配

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

int a[30];

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    int T, n;
    string str;
    cin >> T;
    while(T--){
        cin >> n;
        for(int i=1; i<=26; i++) cin >> a[i];
        cin >> str;

        if(n==1){
            cout << (a[str[0]-'a'+1]==1 ? "Yes\n" : "No\n");
            continue;
        }

        // char now = str[0];
        int cnt = 1;
        bool flg = 0;
        for(int i=1; i<n;){
            while(str[i]==str[i-1] && i<n){
                i++;
                cnt++;
            }
            if(i == n)
                break;
            if(str[i]!=str[i-1]){
                // cout << cnt << "\n";
                // cout << a[str[i-1]-'a'+1];
                if(a[str[i-1]-'a'+1]==0 || cnt % a[str[i-1]-'a'+1] != 0){
                    cout << "No\n";
                    flg = 1;
                    break;
                }
                else{
                    cnt = 1;
                    i++;
                }
            }
        }
        // cout << a[str[n-1]-'a'+1];
        // cout << cnt;
        if(!flg && a[str[n-1]-'a'+1]==0){
            cout << "No\n";
            flg = 1;
            continue;
        }
        if(!flg && cnt % a[str[n-1]-'a'+1] != 0){
            cout << "No\n";
            flg = 1;
            continue;
        }
        if(!flg)
            cout << "Yes\n";
    }

    return 0;
}

C. 规律+优先队列

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 2e5+5;
#define PII pair<int,int>

int id[maxn];
priority_queue<PII, vector<PII>, greater<PII>> pq1, pq2;

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    int k, n;
    cin >> n >> k;
    for(int i=1; i<=n; i++){ 
        int x;
        cin >> x;
        // cout << (x^k) << " ";
        pq1.push({x,i}), pq2.push({(x^k),i});
    }

    if(n==1){
        int x = pq1.top().first;
        cout << x << "\n";
        return 0;
    }

    int cnt = 1;
    while(cnt != n){
        if(cnt%2){
            auto x = pq2.top();
            // cout << x.first<<" ";
            while(id[x.second] == 1){
                pq2.pop();
                x = pq2.top();
                // cout << x.first<<" ";
            }
            pq2.pop();
            id[x.second] = 1;
        }
        else{
            auto x = pq1.top();
            // cout << x.first<<" ";
            while(id[x.second] == 1){
                pq1.pop();
                x = pq1.top();
                // cout << x.first<<" ";
            }
            pq1.pop();
            id[x.second] = 1;
        }
        cnt++;
        // cout << pq1.size() << " "<< pq2.size() << "\n";
    }

    if(n % 2 == 1){
        while(!pq1.empty()){
            auto x = pq1.top();
            if(id[x.second] == 0){
                cout << x.first << "\n";
                break;
            }
            pq1.pop();
        }
    }
    else{
        while(!pq2.empty()){
            auto x = pq2.top();
            if(id[x.second] == 0){
                cout << x.first << "\n";
                break;
            }
            pq2.pop();
        }
    }

    return 0;
}

D. dfs+数论 (Medium)

/*
无限循环小数的性质:
分母为1的情况下,分子只需要含有k的质因数之外的质因子即可
*/
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 2e5+5;

vector<int> prime_factor;
set<int> ans; // 使q/i为有限小数的方案i的个数
int p, q, k;

void dfs(int fac, int level){
    if(fac > q) 
        return;
    if(level == 0) 
        ans.insert(fac);
    if(level == prime_factor.size())
        return;
    // 找到所有形如:i=d*(2^a)*(3^b)*... <= q的数,其中d|p,且因子为k的质因数
    while(fac <= q){
        dfs(fac, level+1);

        if(prime_factor[level] > 1e18/fac)
            break;
        fac *= prime_factor[level];
        if(fac <= q)
            ans.insert(fac);
    }
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    
    cin >> p >> q >> k;

    int id = sqrt(k);
    for(int i=2; i<=id; i++){
        if(k%i == 0){
            prime_factor.push_back(i);
            while(k%i == 0)
                k /= i;
        }
    }
    if(k > 1)
        prime_factor.push_back(k);

    id = sqrt(p);
    for(int i=1; i<=id; i++){
        if(p%i == 0){
            dfs(i, 0);
            if(i != p/i)
                dfs(p/i, 0);
        }
    }

    cout << q - ans.size() << "\n";
    return 0;
}