zoukankan      html  css  js  c++  java
  • Codeforces 837E

    837E - Vasya's Function

    题意

    1. (f(a, 0) = 0)
    2. (f(a, b)=1+f(a, b-gcd(a,b)))

    给出 (a, b) ,求 (f(a, b))

    分析

    首先找出所有 (a) 的因子,然后找出是每个因子倍数的数且小于等于 (b) 的最大值,记录每个数对应的最大的 (a) 的因子 。
    (b) 这个初始值开始,它一定是某个 (a) 的因子的倍数( 毕竟还有因子 (1)),不断减小,在找到下一个某个因子的倍数之前,它的下降速度都是上次的那个 (a) 的因子,直接计算下减了几次就好了。

    code

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    vector<ll> getfac(ll x) {
        vector<ll> fac;
        for(ll i = 1; i * i <= x; i++) {
            if(x % i == 0) {
                fac.push_back(i);
                if(i * i != x) fac.push_back(x / i);
            }
        }
        return fac;
    }
    map<ll, ll> mp;
    int main() {
        ll a, b;
        cin >> a >> b;
        vector<ll> fac = getfac(a);
        vector<ll> res;
        for(int i = 0; i < fac.size(); i++) {
            ll x = b / fac[i] * fac[i];
            if(mp.count(x)) {
                mp[x] = max(mp[x], fac[i]);
            } else {
                res.push_back(x);
                mp[x] = fac[i];
            }
        }
        res.push_back(0);
        sort(res.begin(), res.end());
        ll cnt = 0;
        ll z = res.back();
        for(int i = res.size() - 2; i >= 0; i--) {
            if((z - res[i]) % mp[z] == 0) {
                cnt += (z - res[i]) / mp[z];
                z = res[i];
            }
        }
        cout << cnt << endl;
        return 0;
    }
    
  • 相关阅读:
    八、分组
    七、select使用
    六、SQL基础应用
    五、修改MySQL密码
    side Effect
    js函数式编程
    React生命周期
    Portals
    git使用技巧
    函数式编程
  • 原文地址:https://www.cnblogs.com/ftae/p/7330716.html
Copyright © 2011-2022 走看看