Codeforces 837E - Vasya's Function

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;
}
posted @ 2017-08-09 22:41  ftae  阅读(365)  评论(0编辑  收藏  举报