CF 1379 B. Dubious Cyrpto
Posted ssummerzzz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF 1379 B. Dubious Cyrpto相关的知识,希望对你有一定的参考价值。
题目:给定一个区间范围[l, r]和m,在区间[l, r]中取a, b, c,使得 na + b - c = m(n > 0)。
思路:na + b - c = m,可以看出a和n都是整数,则:
na + b - c = m -> na = m - b + c
b,c∈[l, r] -> na ∈ [m + l - r, m + r - l]
则我们需要找到一个na存在于区间[m + l - r, m + r - l],a∈[l, r],我们可以枚举a,对于该a:
如果:①m / a * a >= m + l - r 且 m / a * a 一定满足小于等于m,则我们把m - (m / a) * a用b,c∈[l, r]凑出来。
否则:②(m / a + 1) * a <= m + r - l 且 (m / a + 1) * a一定满足大于等于m,则我们把m - (m / a + 1) * a用b,c∈[l, r]凑出来
当然有一种特殊情况:③ m < l,则直接 a = l, c = r, b = m - l + r
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <queue> 5 #include <vector> 6 #include <cmath> 7 8 using namespace std; 9 10 #define ll long long 11 #define pb push_back 12 #define fi first 13 #define se second 14 15 const int N = 2e5 + 10; 16 char s[N]; 17 int len; 18 19 void solve() 20 { 21 int T; 22 cin >> T; 23 while(T--){ 24 25 ll l, r, m, a, b, c; 26 cin >> l >> r >> m; 27 28 if(m < l){ 29 a = l; 30 c = r; 31 b = m + r - l; 32 cout << a << " " << b << " " << c << endl; 33 continue; 34 } 35 36 ll ml = m + l - r; 37 ll mr = m + r - l; 38 for(int i = l; i <= r; ++i){ 39 ll times = m / i; 40 if(times * i < ml){ 41 if((times + 1) * i <= mr){ 42 a = i; 43 ll remains = (times + 1) * i - m; 44 b = l; 45 c = l + remains; 46 break; 47 } 48 }else if(times * i >= ml){ 49 ll remains = m - (times * i); 50 a = i; 51 b = r; 52 c = r - remains; 53 break; 54 } 55 } 56 57 cout << a << " " << b << " " << c << endl; 58 } 59 } 60 61 int main() 62 { 63 ios::sync_with_stdio(false); 64 cin.tie(0); 65 cout.tie(0); 66 solve(); 67 68 return 0; 69 }
以上是关于CF 1379 B. Dubious Cyrpto的主要内容,如果未能解决你的问题,请参考以下文章
[CF1379C] Choosing flowers - 贪心,二分,排序
(CF#257)B. Jzzhu and Sequences
CF 999 B. Reversing Encryption