D - Count Subtractions
给定两个整数 \(A,B\),重复下列操作直到 \(A=B\):
- 若 \(A>B\),则令 \(A=A-B\)。
- 否则,令 \(B=B-A\)。
求出一共进行多少次操作。 \(1\leq A,B\leq 10^{18}\)。
sol.
可以发现和求解 \(\text{gcd}\) 特别像,当 \(A>B\) 时一共需要连续让 \(A\) 减小 \(\lfloor\dfrac{A}{B}\rfloor\) 次变为 \(A\mod B\)。复杂度 \(\mathcal O(\log A)\)。
#include<bits/stdc++.h>
using namespace std;
long long a, b, ans;
int main(){
cin >> a >> b;
while(a && b){
if(a > b){
if(a%b == 0)ans += a/b-1;
else ans += a/b;
a %= b;
}else{
if(b%a == 0)ans += b/a-1;
else ans += b/a;
b %= a;
}
}
cout << ans << endl;
return 0;
}
E - Kth Takoyaki Set
有 \(n\) 种商品,第 \(i\) 种商品的价格为 \(a_i\),每种商品都有无限个。求出这些商品能够组合出来的第 \(k\) 小的价格。
\(1\leq n\leq 10,1\leq k\leq 1\times 10^5, 1\leq a_i\leq 10^9\)。
sol.
假设已经求出了前 \(k-1\) 小的价格,分别是 \(p_1,...p_{k-1}\),并且设 \(p_0=0\)。那么 \(p_k\) 肯定等于某个 \(p_i(i\in [0,k-1])\) 加上某个 \(a_j\),并且这个组合没有作为前 \(k-1\) 小的价格。用 \(\text{set}\) 维护可能的价格的集合,集合大小为 \(\mathcal O(kn)\),复杂度就是