首页 > 其他分享 >Codeforces Round 791 (Div. 2) A. AvtoBus

Codeforces Round 791 (Div. 2) A. AvtoBus

时间:2023-09-13 16:36:28浏览次数:36  
标签:std frac ll Codeforces AvtoBus return Div mod equiv

已知有 \(n\) 个轮子,会有一个车队车来换轮,且恰好使用完这些轮子。只知道这些车中有 \(4\) 轮车和 \(6\) 轮车。你需要估计这个车队最少可能有多少车和最多可能有多少车,或判断这是完全不可能的。

观察:\(4x + 6y = n\) ,由裴蜀定理,当 \(2 \mid n\) 有解且 \(2x + 3y = \frac{n}{2}\) 。

此时问题为 \(2, 3\) 的线性组合,显然易于讨论。不妨让 \(n' = \frac{n}{2}\) 。

显然当 \(2x + 3y = n'\) 有非负整数解,当且仅当 \(n' \geq 2\) 即 \(n \geq 4\) 。

考虑最多车,需要让 \(x\) 尽可能大。

  • \(n' \equiv 0 (\mod 2)\) ,\(x = \frac{n'}{2}, y = 0\) 。
  • \(n' \equiv 1 (\mod 2)\) ,\(x = \frac{n' - 3}{2}, y = 1\) 。

考虑最少车,需要让 \(y\) 尽可能大。

  • \(n' \equiv 0 (\mod 3)\) ,\(y = \frac{n'}{3}, x = 0\) 。
  • \(n' \equiv 1 (\mod 3)\) ,\(y = \frac{n' - 4}{3}, x = 2\) 。
  • \(n' \equiv 2 (\mod 3)\) ,\(y = \frac{n' - 2}{3}, x= 1\) 。
view
#include <bits/stdc++.h>
typedef long long ll;
void solve() {
	ll n; std::cin >> n;
	if (n % 2 != 0 || n < 4) std::cout << -1 << '\n';
	else {
		n /= 2;
		ll mi; if (n % 3 == 0) mi = n / 3;
		else if (n % 3 == 1) mi = (n - 4) / 3 + 2;
		else if (n % 3 == 2) mi = (n - 2) / 3 + 1;
		ll mx; if (n % 2 == 0) mx = n / 2;
		else if (n % 2 == 1) mx = (n - 2) / 2 + 1;
		std::cout << mi << ' ' << mx << '\n';
	}
}
signed main() {
	int _ = 1; std::cin >> _;
	while (_--) solve();
	return 0;
} 

可以将问题扩展,若问题不能化为 \(2, 3\) 的线性组合,将不显然。

若给定 \(n, a, b\) ,再问最小最大值。不妨让 \(a \leq b\) 。

问题即解 \(ax + by = n\) 。

一:若 \(gcd(a, b) \mid n\) ,\(ax + by = n\) 有解。若求出 \(x\) 的最小解,此时 \(y \geq 0\) ,\(ax + by = n\) 有非负整数解。

二:当 \(ax + by = n\) 有非负整数解,\(x\) 最大即 \(y\) 最小时车最多,\(x\) 最小时车最少。

view
#include <bits/stdc++.h>
typedef long long ll;
ll exgcd(ll a, ll b, ll &x, ll &y) {
	if (b == 0) {
		x = 1; y = 0;
		return a;
	}
	ll _x, _y;
	ll d = exgcd(b, a % b, _x, _y);
	x = _y;
	y = _x - (a / b) * _y;
	return d;
}
void solve() {
	ll n; std::cin >> n;
	ll a = 4, b = 6;
	if (a > b) std::swap(a, b);
	ll x, y;
	ll g = exgcd(a, b, x, y);
	if (n % g != 0) std::cout << -1 << '\n';
	else {
		a /= g; b /= g; n /= g;
		if (x < 0) x += b;
		x = (x * (n % b)) % b;
		y = (n - a * x) / b;
		if (y < 0) std::cout << -1 << '\n';
		else {
			ll mi = x + y;
			y = (y * (n % a)) % a;
			x = (n - b * y) / a;
			ll mx = x + y;
			std::cout << mi << ' ' << mx << '\n';
		}
	}
}
signed main() {
	int _ = 1; std::cin >> _;
	while (_--) solve();
	return 0;
} 

标签:std,frac,ll,Codeforces,AvtoBus,return,Div,mod,equiv
From: https://www.cnblogs.com/zsxuan/p/17692126.html

相关文章

  • Codeforces Round 897 (Div. 2)
    目录写在前面ABCDE1/E2F写在最后写在前面比赛地址:https://codeforces.com/contest/1867。简略题解。还好没掉分。A令原数列中第\(k\)大对应\(k\)即可。///*By:Luckyblock*/#include<bits/stdc++.h>#defineLLlonglongconstintkN=4e4+10;//============......
  • 【题解】Educational Codeforces Round 141(CF1783)
    评价:educationalA.MakeitBeautiful题目描述:如果一个数组中存在一个数恰好等于该数前面所有数之和,那么这个数组就是丑的。如果一个数组不是丑的,就是美的。比如说:数组$[6,3,9,6]$是丑的,因为\(9=6+3\);数组$[5,5,7]$是丑的,因为第二个\(5=5\)。数组$......
  • Codeforces Round 897 (Div. 2)
    F.MostDifferentTree当\(n=2\)时,只能构造一条长度为\(2\)的链。当\(n\ge3\)时,对于\(i\)\((1\lei\len)\),以\(i\)作为根的树记为\(h_i\),考虑枚举树找一个大小为\(s\)的树\(t\),使得不存在任何一个\(h_i=t\),且\(s\)尽可能小,然后从\(1\)连一条链到该数的根......
  • html div && span 容器元素
    htmldiv&&span容器元素div标签定义HTML文档中的一个分隔区块或者一个区域部分,标签常用于组合块级元素,以便通过CSS来对这些元素进行格式化span用于对文档中的行内元素进行组合标签提供了一种将文本的一部分或者文档的一部分独立出来的方式<html><head>......
  • Codeforces Round 897 (Div. 2)
    CodeforcesRound897(Div.2)A.green_gold_dog,arrayandpermutation分析:由题意:\[c_i=a_i-b_i\]\(c_i\)种类最多就是\(n\)个数都不同。若\(a_i\)不断变大,\(b_i\)不断变小,那么\(c_i\)会不断变大。代码:#include<bits/stdc++.h>usingnamespacestd;usingll......
  • Codeforces Round 897 (Div. 2) A~E
    CodeforcesRound897(Div.2)A~EA:原先数组里面最小的位置放最大的数,次小的放次大的即可。voidsolve(){ intn;cin>>n; for(inti=1;i<=n;i++){ intx;cin>>x; c[i]={x,i}; } sort(c+1,c+1+n); intnum=n; for(inti=1;i<=n;i++){ ans[c[i].second]=num;num--......
  • Codeforces Round 896 (Div. 2)
    CodeforcesRound896(Div.2)A.MakeItZero代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingi128=__int128;intn,m;voidsolve(){scanf("%d",&n);vector<int>a(n+1);for(inti......
  • CodeForces 542B Duck Hunt
    洛谷传送门CF传送门首先转化一下,让鸭子不动,猎人往右移动,就相当于开的相邻两枪距离\(>m\)。设\(f_{x,i}\)为仅考虑\(r\lex\)的鸭子,上一次在\(i\)开枪,能打到的最大鸭子个数。\(f_{x-1}\tof_x\)时,首先有\(f_{x,i}=f_{x-1,i}\)。我们先找到所有\(r=x\)......
  • Codeforces Round 896 (Div. 1)
    Preface不管怎么说,最后还是被我苟上橙名了(虽然刚好2100整,不多不少)感觉我在1900~2100之间卡了好久好久,反观我的队友都是打上紫名后随便两三场就打上橙了,狠狠地羞辱我这个铁混子由于暑假集训打的校内排名比较高,作为新队伍也拿到了今年的一场CCPC+一场ICPC的名额,虽然要自费出行但......
  • Codeforces Round 101 (Div. 2) C - E
    C.Queue(思维、排序、构造、*1800)题意:$n$个人排队,为他们构造一组身高,使得$x$的前面有$a_i$个人比他高。如果无法构造满足所有条件的身高序列,输出-1。思路:首先考虑,对于$a_i$较大的人,肯定尽可能地将其往队伍后面放,然后从后往前构造,因为只有$......