目录
Codeforces Round #653 (Div. 3)解题报告
A - Required Remainder
题意
给定三个数 x , y , n x,y,n x,y,n,求使得 k % x = y , 0 ≤ k ≤ n k\%x=y,0\leq k\leq n k%x=y,0≤k≤n的最大的 k k k。
思路
显然我们可以直接算出比 n n n小的满足 k % x = y k\%x=y k%x=y的值:
- n − n % x + y n-n\%x+y n−n%x+y
- n − n % x − x + y n-n\%x-x+y n−n%x−x+y
第一个式子可能大于 n n n,第二个式子肯定不大于 n n n,判断一下即可。
代码
//
// Created by Visors on 2020/7/6.
//
#include <iostream>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int x, y, n;
cin >> x >> y >> n;
cout << ((n - n % x + y <= n) ? (n - n % x + y) : (n - n % x - x + y)) << endl;
}
return 0;
}
B - Multiply by 2, divide by 6
题意
在一次移动中,你可以将n乘以2或将n除以6(如果n被6整除,没有余数)。
你的任务是找出从n获得1所需的最少移动次数,或者确定是否不可能做到这一点。
你必须回答t个独立的测试案例。
翻译来自DeepL
思路
估算界限
显然我们的操作的最终步骤是要把数除6得到1。
题目中 1 ≤ n ≤ 1 0 9 1\leq n\leq 10^9 1≤n≤109,这个数如果可以一直除,步数大概是 l o g 6 n log_6n lo