多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

CF2260B Monocarp and Projects

CF2260B Monocarp and Projects 原题链接Problem - 2260B - CodeforcesCF2260B Monocarp and Projects - 洛谷我的解答递归优化#includeiostream using namespace std; long long find(long long x, long long y, long long k) { long long ans 0; if (k 1) return y % x; if (y 2 * x) return (y - x) * k; else { ans y % x; ans find(x, y, --k); return ans; } } int main() { long long t, x, y, k; cin t; for (int i 0; i t; i) { cin x y k; cout find(x, y, k) endl; } return 0; }本质就是求y i%(x i) 的累加和0 i k基线条件当k 1时 直接返回当前计算结果不进行下一次递归。否则就记录当前y % x然后对 yx--k进行下一次递归这里的k相当于次数了。不过就这么完结了肯定会TLE——毕竟k可以高达10^12可以注意到如果此时y 2*x 也就是商是1的时候不管以后两边同时1多少次商还是1余数始终是y i - xi);也就是y - x;为什么y t 2*(x t)等价于y 2*x tt ≥ 0始终成立所以就省去了后边的递归同时别忘了累加剩余的次数k最佳解答#include iostream using namespace std; int main() { int t; cin t; while (t--) { long long x, y, k; cin x y k; long long ans 0, i 0; // 前段商 2即 yi 2*(xi)余数逐个在变只能枚举 while (i k y i 2 * (x i)) { ans (y i) % (x i); i; } // 后段商 1余数恒等于 y - x一步算完 ans (k - i) * (y - x); cout ans \n; } return 0; }思路差不多只不过是用的循环方式写的
返回列表