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;
}
原文地址:https://www.cnblogs.com/ftae/p/7330716.html