输出文件

★☆   输入文件:BlackHawk.in   输出文件:BlackHawk.out   评测插件
光阴限制:0.05 s   内部存款和储蓄器限制:256 MB

【标题汇报】

图片 1

正义的萌军瞄准了位于南极洲的眼尖调节器,为此咱们希图用空袭摧毁心灵调节器,然则心灵调整器是这么强大,以至能舒缓调节飞银行人员。一批大侠地铁(feng)兵(zi)决定投弹后自杀来制止心灵调控。然则自杀好优伤,所以萌军指挥官决定到达指标地后让飞机没油而落下(也制止逃兵)。军人提供二种油:原油和华夏输送来的地沟油,刚先导飞机未有油,飞机能够加几桶原油和几桶地沟油(要是原油和地沟油皆有Infiniti桶),飞机落地时必须把道路循环油耗尽,已知一桶重油和一桶地沟油所能支撑的航空中距离离分别为a,b,开车员们必须外出三个目标地,总距离为c.

1.最少,最多须求加几桶油,若独有一种方案,最少和最多的是一样的.

2.总共有多少种分裂的加油配方(死法)能达到指标地。

【输入格式】

独有一行,七个正整数a,b,c

【输出格式】

两行,第一行事最少加几遍油和最多加一次油,

其次作为加油方法总的数量。

若不设有任何措施,第一行输出-1 -1

其次行输出0

【样例输入】

样例1:
2 3 10
样例2:
6 8 10

【样例输出】

样例1:
4 5
2
样例2:
-1 -1
0

【提示】

样例解释:

样例一:飞机加几遍原油,五四处沟油,总次数为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

两个答案分值权重分别为60%,30%,一半

【来源】

 

这几个题就是个扩充欧几里得的裸题,也不算太裸,因为涉及到求最小值和最大值的主题材料

不过自个儿写了贰个交上去爆零,后来看了看比人写的代码,发现仍旧懵逼在45—49行里。。

4546形似是求最大间距,,可是为啥要/b/a呢?x为何要加负号呢??

再有ans1,ans2的b-a是何等鬼。。

啊啊啊啊啊啊为何为啥为何。。。。。。

=.=

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<vector>
 6 #include<map>
 7 #define LL long long 
 8 using namespace std;
 9 LL a,b,c,x,y;
10 LL read(LL & n)
11 {
12     int flag=0,x=0;char c='/';
13     while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;}
14     while(c>='0'&&c<='9')x=x*10+(c-48),c=getchar();
15     if(flag)n=-x;
16     else n=x;
17 }
18 LL gcd(LL a,LL b)
19 {
20     if(b==0)return a;
21     else return gcd(b,a%b);
22 }
23 LL exgcd(LL a,LL b,LL &x ,LL & y)
24 {
25     if(b==0)
26     {x=1;y=0;return a;}
27     LL r=exgcd(b,a%b,x,y);
28     LL tmp=x;x=y;y=tmp-(a/b)*y;
29     return r;
30 }
31 int main()
32 {
33     //freopen("BlackHawk.in","r",stdin);
34     //freopen("BlackHawk.out","w",stdout);
35     //read(a);read(b);read(c);
36     cin>>a>>b>>c;
37     LL p=gcd(a,b);
38     if(c%p!=0)
39     {
40         printf("-1 -1\n0");
41         return 0;
42     }
43     exgcd(a,b,x,y);
44 //    printf("%d %d",x,y);
45     LL xx=ceil((long double)-x/b*c);
46     LL yy=floor((long double)y/a*c);
47     LL ans=yy-xx+1;
48     LL ans1=x*c/p+y*c/p+(b-a)/p*yy;
49     LL ans2=x*c/p+y*c/p+(b-a)/p*xx;
50     if(ans<=0) printf("-1 -1\n0");
51     else cout<<min(ans1,ans2)<<" "<<max(ans1,ans2)<<endl<<ans;
52     return 0;
53 }