首页 > 代码库 > COGS——T 2057. [ZLXOI2015]殉国
COGS——T 2057. [ZLXOI2015]殉国
http://cogs.pro/cogs/problem/problem.php?pid=2057
★☆ 输入文件:BlackHawk.in
输出文件:BlackHawk.out
评测插件
时间限制:0.05 s 内存限制:256 MB
【题目描述】
正义的萌军瞄准了位于南极洲的心灵控制器,为此我们打算用空袭摧毁心灵控制器,然而心灵控制器是如此强大,甚至能缓慢控制飞行员。一群勇敢的士(feng)兵(zi)决定投弹后自杀来避免心灵控制。然而自杀非常痛苦,所以萌军指挥官决定到达目的地后让飞机没油而坠落(也避免逃兵)。军官提供两种油:石油和中国输送来的地沟油,刚开始飞机没有油,飞机可以加几桶石油和几桶地沟油(假设石油和地沟油都有无限桶),飞机落地时必须把油耗尽,已知一桶石油和一桶地沟油所能支撑的飞行距离分别为a,b,驾驶员们必须飞往一个目的地,总距离为c.
1.最少,最多需要加几桶油,若只有一种方案,最少和最多的是相同的.
2.总共有多少种不同的加油配方(死法)能到达目的地。
【输入格式】
只有一行,三个正整数a,b,c
【输出格式】
两行,第一行为最少加几次油和最多加几次油,
第二行为加油方法总数。
若不存在任何方法,第一行输出-1 -1
第二行输出0
【样例输入】
样例1:2 3 10样例2:6 8 10
【样例输出】
样例1:4 52样例2:-1 -10
【提示】
样例解释:
样例一:飞机加两次石油,两次地沟油,总次数为4,2*2+3*3=10
飞机加五次石油,不加地沟油,总次数为5,2*5+3*0=10
总共两种
样例二:飞机无法到达目的地
数据范围:
对于10%的数据,a<=103,b<=103,c<=103
对于20%的数据,a<=104,b<=104,c<=106
对于50%的数据,a<=109,b<=109,c<=109
对于100%数据,a<=3⋅1018,b<=3⋅1018,c<=3⋅1018
三个答案分值权重分别为20%,30%,50%
【来源】
exgcd求出 x0,y0
则 x=x0+kbb,y=y0-kaa 由题意得 x>=0 y>=0
求出k的范围 从而得出方案数
因为是线性方程 所以在 定义域的边界得到最值
1 #include <algorithm> 2 #include <iostream> 3 #include <cstdio> 4 #include <cmath> 5 6 using namespace std; 7 8 #define LL long long 9 LL a,b,c,x,y;10 LL ans_num;11 12 LL exgcd(LL a,LL b,LL &x,LL &y)13 {14 if(b==0)15 {16 x=1; y=0;17 return a;18 }19 LL ret=exgcd(b,a%b,x,y);20 LL tmp=x;21 x=y;22 y=tmp-(a/b)*y;23 return ret;24 }25 26 int main()27 {28 freopen("BlackHawk.in","r",stdin);29 freopen("BlackHawk.out","w",stdout);30 31 scanf("%lld%lld%lld",&a,&b,&c);32 LL gcd=exgcd(a,b,x,y);33 if(c%gcd!=0)34 {35 printf("-1 -1\n0");36 return 0;37 }38 LL L=ceil((long double)-x/b*c);39 LL R=floor((long double)y/a*c);40 x*=(c/gcd); y*=(c/gcd);41 LL aa=a/gcd,bb=b/gcd;42 ans_num=R-L+1;43 LL an1=x+y+(bb-aa)*L;44 LL an2=x+y+(bb-aa)*R;45 if(ans_num<=0) printf("-1 -1\n0");46 else47 {48 printf("%lld ",min(an1,an2));49 printf("%lld\n",max(an1,an2));50 printf("%lld",ans_num);51 }52 return 0;53 }
COGS——T 2057. [ZLXOI2015]殉国