UVA10090 数论基础 exgcd
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1031
题目大意:有n块大理石,然后有两种盒子,cost分别为c1,c2,容量分别为n1,n2,问你装完这些大理石所需要的最小花费是多少
思路分析:设最终选择x个第一种盒子,y个第二种盒子
根据题目,有 n1*x+n2*y=n ,让求T=c1*x+c2*y的最小值
解不定方程,容易想到使用exgcd ,n1*x0+n2*y0=gcd(n1,n2)
比较两式即可得到x=n*x0/gcd(n1,n2),y=n*y0/gcd(n1,n2)
结果肯定为正整数么,若n%gcd(n1,n2)!=0,则无解
通解为 x=n*x0/gcd(n1,n2) +k*n2/gcd(a,b)
y=n*y0/gcd(n1,n2)-k*n1/gcd(a,b)
同时要求x>=0,y>=0,我们就可以解得k的范围
k1=ceil(-n*x0/n2)<=k<=floor(n*y0/n1)=k2
若k1>k2,说明也是无解
否则带入T表达式 T=c1*(n*x0/gcd(n1,n2) +k*n2/gcd(a,b))+c2*( n*y0/gcd(n1,n2)-k*n1/gcd(a,b))
整理发现这是一个关于k的一次函数,系数为m=c1*n2-c2*n1,若m>=0,递增,取k1
否则取k2
代码:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==)
{
x=;
y=;
return a;
}
ll d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int main()
{
ll n;
ll c1,n1,c2,n2;
while(scanf("%lld",&n)&&n)
{
ll x,y;
scanf("%lld%lld",&c1,&n1);
scanf("%lld%lld",&c2,&n2);
ll g=exgcd(n1,n2,x,y);
if(n%g) {printf("failed\n");continue;}
ll x0=x,y0=y;
x=x*n/g;
y=y*n/g;
ll k1=ceil((-n*x0/(double)n2));
ll k2=floor(n*y0/(double)n1);
if(k1>k2) {printf("failed\n");continue;}
ll t=c1*n2-c2*n1;
ll ans1,ans2;
if(t>=)
{
ans1=x+k1*n2/g,ans2=y-k1*n1/g;
}
else ans1=x+k2*n2/g,ans2=y-k2*n1/g;
printf("%lld %lld\n",ans1,ans2);
}
}
UVA10090 数论基础 exgcd的更多相关文章
- 「kuangbin带你飞」专题十四 数论基础
layout: post title: 「kuangbin带你飞」专题十四 数论基础 author: "luowentaoaa" catalog: true tags: mathj ...
- 你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)
摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过.同时数论基础也是 Hash 算法,RS ...
- 【BZOJ5418】【NOI2018】屠龙勇士(数论,exgcd)
[NOI2018]屠龙勇士(数论,exgcd) 题面 洛谷 题解 考场上半个小时就会做了,一个小时就写完了.. 然后发现没过样例,结果大力调发现中间值爆\(longlong\)了,然后就没管了.. 然 ...
- 从BZOJ2242看数论基础算法:快速幂,gcd,exgcd,BSGS
LINK 其实就是三个板子 1.快速幂 快速幂,通过把指数转化成二进制位来优化幂运算,基础知识 2.gcd和exgcd gcd就是所谓的辗转相除法,在这里用取模的形式体现出来 \(gcd(a,b)\) ...
- 数论基础算法总结(python版)
/* Author: wsnpyo Update Date: 2014-11-16 Algorithm: 快速幂/Fermat, Solovay_Stassen, Miller-Rabin素性检验/E ...
- kuangbin专题 数论基础 part1?
线段树专题太难了,那我来做数学吧! 但数学太难了,我......(扯 这两天想了做了查了整理了几道数学. 除了一些进阶的知识,像莫比乌斯反演,杜教筛,min25学不会我跳了,一些基础的思维还是可以记录 ...
- lightoj1336数论基础
#include<iostream> #include<cstdio> #include<cmath> #define ll long long using nam ...
- 1370 - Bi-shoe and Phi-shoe(LightOJ1370)(数论基础,欧拉函数)
http://lightoj.com/volume_showproblem.php?problem=1370 欧拉函数: 在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. φ(n) ...
- 密码学数论基础部分总结之 有限域GF(p) Galois Fields
今天花了一下午的时间学习密码学的数论部分,下面将学到的内容进行一下总结,也算是加深记忆.我本身对密码学这方面比较感兴趣,而且本节出现了许多数学公式,使用刚刚学习的LaTex公式来呈现出来,练习练习,何 ...
随机推荐
- 细说PHP优化那些事
我们在用PHP编程的时候,总是想要使自己的程序占用资源最小,运行速度更快,代码量更少.往往我们在追求这些的同时却失去了很多东西.下面我想讲讲我对PHP优化的理解.优化的目的是花最少的代价换来最快的运行 ...
- Symfony2目录结构说明
了解框架的目录结构是框架快速入门的一个途径,一个成熟的框架,每个功能模块都被划分存放在不同的目录. Symfony2一级目录结构: ├── app //这目录下包含了,配置文件(应用的配置文件会被im ...
- 无线通信技术协议-Zigbee 3.0
物联网的无线通信技术有:短距离的无线局域网通信技术和长距离的无线广域网通信技术. 短距离局域网通信技术有Zigbee.Wi-Fi.Bluetooth.Z-wave.6LoWPAN等. 长距离广域网通信 ...
- 不要if else的编程
http://news.cnblogs.com/n/194216/ 英文原文:Unconditional Programming ] 本文作者介绍 Michael Feathers Michael F ...
- C++ 单向链表反转
单向链表反转,一道常见的面试题,动手实现下. #include "stdafx.h" #include <stdlib.h> struct Node{ int data ...
- PHP 中的静态变量的简单使用
静态变量的初始化只能在第一次static 声明的时候进行,这些静态变量只能在声明他的函数中访问到. 例如: <?php function do_something(){ static $firs ...
- Java---设计模块(工厂方法)
★ 场景和问题 Java程序开发讲究面向接口编程,隐藏具体的实现类,可是如何得到接口呢? 工厂类的命名规范:***Factory 单例工厂方法的命名规范:getInstance() 工厂的本质是&qu ...
- WEB/ WCF安全认证
- C++中输出流运算符的重载
cout是ostream类的对象,cin是istream类的对象. 我们平时用的cout<<就相当于cout.operator<<(...).也就是说正常使用(不对operat ...
- linux0.12 学习总序(不断更新状态中)
最近有空闲时间,想静下心来学点东西.一直对kernel有兴趣,又苦于无从下手,就拿linux0.12练手.尝试了解并熟悉kernel各模块工作原理. 接下来的博客主要用来记录自己所遇到的问题和解决的方 ...