您的位置:首页 > 编程语言

virtual hust 2013.6.21 NEFU 挑战编程----数论 G - Marbles

2013-06-21 21:16 387 查看
题目:Marbles

思路: 扩展欧几里得。

由于公式套出来的答案x,y,如果是(x*c)%b的话,求的是满足条件的x最接近于0的那组解,所以根据两种box的单位运输价值来判断到底是取x越小越好还是取y越小越好

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <cstring>
using namespace std;
long long gcd(long long a,long long b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
long long exgcd(long long a,long long b,long long &x,long long &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
else
{
long long ans=exgcd(b,a%b,x,y);
long long t=x;
x=y;
y=t-a/b*y;
return ans;
}
}
int main()
{
long long n,c1,c2,n1,n2;
while(scanf("%lld",&n),n)
{
scanf("%lld%lld",&c1,&n1);
scanf("%lld%lld",&c2,&n2);
long long x,y;
long long tmp=gcd(n1,n2);
if(n%tmp!=0)
{
printf("failed\n");
}
else
{
n/=tmp;
n1/=tmp;
n2/=tmp;
exgcd(n1,n2,x,y);
if(n1*c2<n2*c1)
{
x*=n;
x%=n2;
y=(n-x*n1)/n2;
}
else if(n1*c2==n2*c1)
{
if(n1<=n2)
{
x*=n;
x%=n2;
y=(n-x*n1)/n2;
}
else
{
y*=n;
y%=n1;
x=(n-y*n2)/n1;
}
}
else
{
y*=n;
y%=n1;
x=(n-y*n2)/n1;
}
int tag=0;
if(x<0)
{
while(x<0)
x+=n2;
y=(n-x*n1)/n2;
if(y<0)
tag=-1;
}
else if(y<0)
{
while(y<0)
y+=n1;
x=(n-y*n2)/n1;
if(x<0)
tag=-1;
}
if(tag==-1)
printf("failed\n");
else
printf("%lld %lld\n",x,y);
}
}
return 0;
}


AC Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: