题目地址:http://codeforces.com/contest/1244/problem/C

题目:


求满足等式的x,y,z值:

wx+dy=p

x+y+z=n

且w>d,

解题思路:


网上的题解都说是使x+y的值最小,好像并不是吧,我在题目中并没有找到原话,题目好像只是要求wx>dy(应该是这样吧)。

为了保证wx>dy和z>0,由于w>d,所以应该尽量使x的值大一些,y的值小一些。

  • 方法1:枚举法

对于满足等式的一组解(x0,y0),那么必有(x0+d,y0-w), (x0+2d,y0-2w),(x0+3d,y0-3w)。。。满足上述两个等式,但是又因为y要>=0,所以当y0-kw<w时,无法再更新答案了,若此时的z>=0,那么就找到了解,否则无解。

[0,w)内枚举y的值即可,1e5的时间复杂度,可行。

  • 方法2:扩展欧几里得

如果直接用扩展欧几里德求解方程wx+dy=p的话,x *= p/gcd(w,d); y *= p/gcd(w,d);很可能会超时,且无法保证满足题目wx>dy的要求。

先使wx+dy=p中x的值最大,赢的场数win=p/w,剩下的分数leftp=p%w,剩下的分数全部用于平局,能够完成平局draw=leftp/d,最终还会剩下leftp=leftp%d分数没有得到分配(如果leftp不能完全分完)。

现在考虑改变win和draw的值,使得leftp被分配完,所以问题转化为wx'+dy'=leftp的求解。对于此线性方程,根据扩展欧几里得原理知,如果gcd(w,d) | leftp,那么此线性方程有解,否则无解。

如果有解,更新win和draw值(原始的值分别加上wx'+dy'=leftp对应的解),但是可能值更新完后win<0 || draw<0 || n-win-draw<0的情况,所以需要对win值和draw值做调整。

现在相当于求出了wx+dy=p通解中的定值部分,如下图:

若对win和draw做调整,只需+/-后面的部分,在更新过程中如果更新的值不满足win>=0 && draw>=0 && n-win-draw>=0,说明无解。

ac代码:


枚举:

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int main()
{ll n, p, w, d;cin >> n >> p >> w >> d;bool f = 0;for(ll y = 0; y < w; y++){if((p-y*d)%w == 0){ll x = (p-y*d)/w;if(x >= 0 && x+y <= n){printf("%lld %lld %lld", x, y, n-x-y);f = 1;break;}}}if(!f) printf("-1");return 0;
}

扩展欧几里得:

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll n, p, w, d, x, y, win, draw;
ll exgcd(ll a, ll b, ll &x, ll &y)
{if(b == 0){x = 1;y = 0;return a;}ll r = exgcd(b, a%b, x, y);ll t = x;x = y;y = t - a/b*y;return r;
}
bool solve()
{ll leftp = p%w;win = p/w, draw = leftp/d, leftp = leftp%d;//平局分完还剩下的分数ll gcd = exgcd(w, d, x, y);//wx+dy = gcd(w,d)if(leftp%gcd == 0)//可再分配,相当于wx+dy=leftp有解{ll t = leftp/gcd;win += t*x;//最终结果先加上已经确定的值, x,y可能是负数draw += t*y;ll k1 = d/gcd, k2 = w/gcd;//通解的变化部分,且k2>k1while(win < 0){win += k1;draw -= k2;if(draw < 0) return false;}while(draw < 0){win -= k1;draw += k2;if(win < 0) return false;}while(n-win-draw < 0)//让win+draw减小,z>=0{win += k1;draw -= k2;if(win < 0 || draw < 0) return false;}if(win >= 0 && draw >= 0 && win+draw <= n)return true;}return false;
}
int main()
{cin >> n >> p >> w >> d;if(solve()) printf("%lld %lld %lld\n", win, draw, n-win-draw);else printf("-1");return 0;
}

【CF1244C】The Football Season(思维枚举/扩展欧几里德)相关推荐

  1. CF1244C The Football Season

    https://www.luogu.com.cn/problem/CF1244C 先把下面那个条件转换一下变成 x+y≤nx+y\le nx+y≤n 注意到d<wd<wd<w,所以y ...

  2. (扩展欧几里德算法)zzuoj 10402: C.机器人

    10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...

  3. 扩展欧几里德算法详解

    转自:http://blog.csdn.net/zhjchengfeng5/article/details/7786595 扩展欧几里德算法 谁是欧几里德?自己百度去 先介绍什么叫做欧几里德算法 有两 ...

  4. poj 2115 C Looooops(扩展欧几里德算法)

    题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循环几次才会结束. 比如:当k=4时,存储的数 i 在0-15之间循环.(本题默认为无符号) 若在有限次内结束,则输出 ...

  5. 欧几里德与扩展欧几里德算法——密码学笔记(五)

    一.欧几里德算法 又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a% ...

  6. 欧几里德算法与扩展欧几里德算法

    欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...

  7. 数论:扩展欧几里德(洛谷P1516 青蛙的约会)

    欧几里德 基本思想:gcd(q,r)=gcd(r,q%r); 证明,设q.r的最大公因数为a,则q=xa,r=ya,xy互质 不妨设x>y(显然如果小于会在一次gcd运算后交换) 则q%r=(x ...

  8. POJ2891 Strange Way to Express Integers (扩展欧几里德)

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia 题目大意 求解一组同余方程 x ≡ r1 (mod a1) x ≡ r2 (mod a2) x ≡ r ...

  9. Codeforces Beta Round #7 C. Line 扩展欧几里德

    C. Line time limit per test 1 second memory limit per test 256 megabytes input standard input output ...

  10. POJ 2891 Strange Way to Express Integers ★ (扩展欧几里德解同余式组)

    题目链接:http://poj.org/problem?id=2891 题目大意: 很好的一道题,解同余式组: x = r1 (mod m1) x = r2 (mod m2) -- x = rp (m ...

最新文章

  1. ETC带火车牌识别设备 多方企业狭路相逢
  2. ubuntu 安装OpenBLAS
  3. [Enterprise Library]Configuration类设计分析
  4. 机器学习知识总结系列- 特征工程(1-1)
  5. 一份从 0 到 1 的 Java 项目实践清单
  6. js中div显示和隐藏钮为什么页面总是跳一下到最上面
  7. 目标检测——评价指标的学习笔记
  8. 数据库学习入门(转)
  9. c语言小程序 祝你生日快乐!
  10. html5仿苹果通讯录效果,仿IOS手机通讯录效果
  11. css文件更新后浏览器网页仍然显示以前的页面解决方法
  12. 【ML】特征归一化、为什么归一化、归一化的方法、归一化方法选择依据
  13. 程序员为什么一定要学好数学?驻足听一下“老人言”
  14. TM中拒收自定义表情的设置方法(转)
  15. 计算机班音乐课怎么上,如何运用电脑课件进行音乐教学.doc
  16. python通过命令升级pip出错解决方法
  17. 通往编程高手之路:《深入理解操作系统》
  18. 【远程桌面管理小工具】
  19. 微机原理 17-地址传送指令
  20. iPhone快捷指令导出文件.shortcut格式后缀文件解密

热门文章

  1. [公告]积分算法问题改正
  2. Intellij IDEA创建第一个项目的视频
  3. Java接受带文件的表单,Javaweb使用getPart来接收表单文件
  4. python 进程池阻塞和非阻塞_Python协程还不理解?请收下这份超详细的异步编程教程!还没学会来找我!...
  5. 3x3矩阵怎么求逆矩阵_矩阵型组织结构,郭士纳与任正非都是怎么说的?
  6. 易门一中2021年高考成绩查询,附属易门中学2021届高二年级教师参加“中国高考评价体系下的2021年一轮备考策略”直播会...
  7. ELK 企业内部日志分析系统
  8. 关于git远程分支操作
  9. Docker docker-compose 配置lnmp开发环境
  10. 瑞典驻华参赞:智慧城市建设提升为国家战略