第十届蓝桥杯省赛C++研究生组

#include <bits/stdc++.h>


using namespace std;

typedef vector<int> vi;
typedef long long ll;
typedef vector<ll> vll;
typedef pair<int, int> ii;
typedef vector<ii> vii;
typedef vector<bool> vb;
typedef unsigned long long ull;
#define lowbit(S) ((S) & -(S))
#define pb push_back
#define bg begin()
#define ed end()
#define sz(x) ((int)(x.size()))


template<typename T>
bool isPrime(T x){
    if (x > 2 && x % 2 == 0) return false;
    for (T i = 3; i * i <= x; i += 2)if (x % i == 0) return false;
    return true;
}

template<typename T>
int gcd (T a, T b){
    return b == 0 ? a : gcd(b, a % b);
}

template<typename T>
T quickPow(T a, T b, T mod){
    ll result = 1;
    while (b){
        if (b & 1){
            result = (1ull * result * a)  % mod;
        }
        a = (1ull * a * a) % mod;
        b >>= 1;
    }
    return result % mod;
}



class UnionFind{
private:
    vi fa, setSize, weight;
    int numSets;
public:
    UnionFind(int m){
        fa.assign(m, 0);for (int i = 0; i < m; ++i) fa[i] = i;
        setSize.assign(m, 1);
        numSets = m;
    }
    int findSet(int x){
        if (fa[x] == x)return x;
        int root = findSet(fa[x]);
        return fa[x] = root;
    }
    int isSameset(int x, int y){return findSet(x) == findSet(y);}
    void unionSet(int x, int y){
        x = findSet(x), y = findSet(y);
        if (x == y) return;
        fa[x] = y;
        setSize[y] += setSize[x];
        numSets -= 1;
    }
};







void AAA(){
    vector<char> model = {'2', '0', '1', '9'};
    ll result = 0;
    for (int i = 1; i <= 2019; ++i){
        string s = to_string(i);
        bool ok = false;
        for (auto& x : s){
            for (auto y : model) if (x == y){
                ok = true;
                break;
            }
            if (ok) break;
        }
        if (ok) result += 1ll * i * i * i;
    }
    cout << result << endl; //4097482414389
}






void BBB(){
    string s = "LANQIAO";
    int n = sz(s), k = 1;
    ll result = 0;
    for (int i = n - 1; i >= 0; --i){
        result += 1ll * (s[i] - 'A' + 1) * k;
        k *= 26;
    }
    cout << result << endl; //3725573269
}






void CCC(){
    ll result;
    int cnt = 1;
    for (ll i = 2; cnt <= 2019; ++i){
        if (isPrime(i)) {cnt += 1;}
        result = i;
    }
    cout << result << endl; //17569
}




void DDD(){
    //直接数
    cout << 6 << endl;
}




//尚未解决大数计算问题
void EEE(){
    ll n = 1001733993063167141, p, q, d = 212353, e, c = 20190324;
    /*
    for (ll i = 2; i * i <= n; ++i){
        if (n % i == 0 && isPrime(i) && isPrime(n / i)){
            cout << i << " " << n / i << endl;//891234941 1123984201
        }
    }*/
    p = 891234941, q = 1123984201;
    int k = 1;
    while ((k * 1ull * (p - 1) * (q - 1) + 1 ) % d){k += 1;}    //挂在大数上了
    e = (k * 1ull * (p - 1) * (q - 1) + 1 ) / d;//57230754987937
    cout << 1ll * quickPow(c, e, n);  //649483095833502927

}






void FFF(){
    vll f(100, 1);
    for (int i = 3; i <= 100; ++i) f[i] = f[i - 1] + f[i - 2];
    //for (int i = 1; i < 100; ++i){cout << fixed << setprecision(8) << i << "  " << (double)f[i] / f[i + 1] << endl;}
    int n;
    cin >> n;
    if (n <= 91) cout << fixed << setprecision(8) << (double)f[n] / f[n + 1] << endl;
    else cout << "0.61803399" << endl;
}





bool checkG(const vi& a, const int N, int s){
    int l = 1, r = 1;
    for (auto& x : a){
        if (l <= x){if ((x - l) * 2 > s) return false; r = max(r, x + (s - (x - l) * 2) / 2);}
        else r = max(r, x + s / 2);
        l = r + 1;
    }
    return r >= N;
}
void GGG(){
    int n, k;
    cin >> n >> k;
    vi a(k);
    for (auto& x : a) cin >> x;
    sort(a.bg, a.ed);
    int l = 1, r = 2 * n;
    while(l < r){
        int mid = (l + r) >> 1;
        if (checkG(a, n, mid)){r = mid;}
        else l = mid + 1;
    }
    cout << l << endl;
}








void HHH(){
    int n;
    cin >> n;
    vi a(n);
    UnionFind uf(1e6 + 233);
    for (auto& x : a){
        cin >> x;
        int parent = uf.findSet(x);
        x = parent;
        uf.unionSet(parent, parent + 1);
    }
    for (int i = 0; i < n; ++i){cout << a[i] << " \n"[i == n - 1];}
}


void III(){
    //前缀和可以任意交换次序
    //通过交换前缀和次数更改最大值
}

void JJJ(){
    //待查看
}





































int main(){
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    

    return 0;
}




题目待总结

E题大数计算未解决

H I问题待研究

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值