2020.11.21 模拟赛(持续更新)

T1 Jams 倒酒(pour)

题目大意:给出两个容积分别为a和b的酒杯与一个装有无限多酒的酒桶。规定以下三种操作:用酒桶中的酒将容积为b的酒杯填满、将容积为a的酒杯中的酒全部倒入酒桶中、将容积为b的酒杯中的酒倒入容积为a的酒杯中。其中在进行第三种操作时,若容积为a的酒杯在倒了一部分酒后就达到了容积,那么剩余的酒将留在容积为b的酒杯中。求无限次操作后,能在容积为a的酒杯中倒出的最小体积的酒以及第二种操作和第一种操作(在倒出的酒的体积不变的情况下)的最小操作数。

我们经过观察,发现题目可以转化成:对于不定方程bxay=d,求出最小的dyx。为了便于用exgcd计算,我们将不定方程bxay=d转换为bx+ay=d,要求求出的值也变成了dyx

————————————————————————————————————————————————————————————

定理1:对于不定方程bx+ay=d,最小的dgcd(a,b)

证:设存在d0<gcd(a,b),则有bx0+ay0=d0

将不定方程bx0+ay0=d0两边同时除以gcd(a,b),得到bx0gcd(a,b)+ay0gcd(a,b)=d0gcd(a,b)

因为agcd(a,b), bgcd(a,b),所以(bx0gcd(a,b)+ay0gcd(a,b))1,d0gcd(a,b)1

因为d0<gcd(a,b),所以d0gcd(a,b)1,与上述证明冲突。

证毕。

————————————————————————————————————————————————————————————

随后我们使用exgcd求出不定方程bx+ay=gcd(a,b)的一组特解x0y0。由于操作数必须为正整数,所以需要将y0变为最小正整数。设新的一组特解为(x1,y1),则y1=y0+y0gcd(a,b)ay0。将y1代入不定方程bx1+ay1=gcd(a,b),得出x1的值。输出dyx即可。

Copy
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; #define int long long int a, b, x, y, k0, k1, Gcd; int exgcd(int a0, int b0) { if (b0 == 0) { x = 1; y = 0; return a0; } int d = exgcd(b0, a0 % b0); int z = x; x = y; y = z - y * (a0 / b0); return d; } signed main() { freopen("pour.in", "r", stdin); freopen("pour.out", "w", stdout); cin >> a >> b; if (a == b) { cout << a << endl << "0 1"; return 0; } Gcd = exgcd(a, b); cout << Gcd << '\n'; k0 = b / Gcd; k1 = a / Gcd; y += (y / k1) * k1; if (y < 0) y += k1; cout << -(Gcd - y * b) / a << " " << y; return 0; }

T2 土豪聪要请客

题目大意:给出一张由'.'或'X'组成的大厅地图,规定只有由'.'组成的长方形区域才可以放下桌子。一个由'.'组成的长为m,宽为n的长方形所能容纳的桌子可以坐下2(n+m)1个人,求在大厅中最多能坐下的人数。

欢迎关注我的公众号:智子笔记

posted @   David24  阅读(209)  评论(4编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
点击右上角即可分享
微信分享提示