837E - Vasya's Function
题意
- (f(a, 0) = 0)
- (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;
}