2019HDU多校第七场 HDU6646 A + B = C 【模拟】
一、题目
二、分析
比较考验码力的题。
对于$c$,因为首位肯定不为0,那么$a$或者$b$至少有一个最高位是和$c$平齐的,或者少一位(相当于$a$+$b$进位得到)。
那么这里,我们可以分四种情况
1 让$a$与$c$变为等长$A$和$C$
等长后判断$R = C - A$是否等于$b$,这里的等实际上是${R}\times{10^{d1}}$与${b}\times{10^{d2}}$比较,$d1$和$d2$都可能为结果做出贡献。
2 让$a$与$c$变为等长$A$和$C$,但$C$继续增长一位变为$C = {C}\times{10}$
判断$R = C - A$是否等于$b$,后面同上。
3 让$b$与$c$变为等长$B$和$C$
同情况1
4 让$b$与$c$变为等长$B$和$C$,但$C$继续增长一位变为$C = {C}\times{10}$
同情况2
然后就是紧张刺激的码代码了,细节很多,因为变量太多,该初始化的要初始化,特别是X,Y,Z的变化一定要即时增长。
三、AC代码
1 #include <bits/stdc++.h>
2
3 using namespace std;
4 #define ll long long
5 #define Min(a,b) ((a)>(b)?(b):(a))
6 #define Max(a,b) ((a)>(b)?(a):(b))
7 const int maxn = 1e5+13;
8 char aa[maxn], bb[maxn], cc[maxn];
9 int a[maxn], b[maxn], c[maxn];
10 int lena, lenb, lenc;
11 int la, lb, lc;
12 int tx, ty, tz, deta1, deta2, deta3;
13
14 void debug()
15 {
16 cout << " a ";
17 for(int i = 0; i < la; i++)
18 cout << a[i];
19 cout << endl << " c ";
20 for(int i = 0; i < lc; i++)
21 cout << c[i];
22 cout << endl;
23 }
24
25 // A - B == C
26 bool check(int A[], int B[], int C[], int LA, int LB, int LC)
27 {
28 deta1 = deta2 = deta3 = 0; //变化量
29 if(A[0] < B[0])
30 return false;
31 int Res[maxn], L = LA;
32 int pos = L - 1, tmp = 0;
33 int i, j;
34 for(i = LA - 1, j = LB - 1; i >= 0 && j >= 0; i--, j--, pos--)
35 {
36 A[i] -= tmp;
37 tmp = 0;
38 Res[pos] = A[i] - B[j];
39 if(Res[pos] < 0)
40 {
41 tmp = 1;
42 Res[pos] += 10;
43 }
44 }
45 for(i; i >= 0; i--, pos--)
46 {
47 A[i] -= tmp;
48 tmp = 0;
49 Res[pos] = A[i];
50 if(Res[pos] < 0)
51 {
52 tmp = 1;
53 Res[pos] += 10;
54 }
55 }
56 if(tmp > 0)
57 return false;
58 // 判断 Res == C * 10^deta
59 // 或者 Res * 10 ^ deta = C
60 for(i = 0; i < L; i++)
61 {
62 if(Res[i] != 0)
63 break;
64 }
65 for(j = 0; j < LC && i < L; j++, i++)
66 {
67 if(Res[i] != C[j])
68 return false;
69 }
70 while(i < L)
71 {
72 if(Res[i] != 0)
73 return false;
74 deta3++;
75 i++;
76 }
77 while(j < LC)
78 {
79 if(C[j] != 0)
80 return false;
81 deta1++;
82 j++;
83 }
84 deta2 = deta1;
85 // cout << "Res : ";
86 // for(i = 0; i < L; i++)
87 // cout << Res[i];
88 // cout << endl << "C : ";
89 // for(i = 0; i < LC; i++)
90 // cout << C[i];
91 // cout << endl;
92 return true;
93 }
94
95 void init1()
96 {
97 tx = 0, ty = 0, tz = 0;
98 for(int i = 0; i < lena; i++)
99 a[i] = aa[i] - '0';
100 for(int i = 0; i < lenb; i++)
101 b[i] = bb[i] - '0';
102 for(int i = 0; i < lenc; i++)
103 c[i] = cc[i] - '0';
104 la = lena, lb = lenb, lc = lenc;
105 if(la > lc)
106 {
107 lc = la;
108 tz += (lc - lenc);
109 for(int i = lenc; i < lc; i++)
110 {
111 c[i] = 0;
112 }
113 }
114 else if(la < lc)
115 {
116 la = lc;
117 tx += (la - lena);
118 for(int i = lena; i < la; i++)
119 {
120 a[i] = 0;
121 }
122 }
123 //cout << "tx : " << tx << " ty : " << ty << " tz : " << tz << endl;
124 }
125 void init2()
126 {
127 tx = 0, ty = 0, tz = 0;
128 for(int i = 0; i < lena; i++)
129 a[i] = aa[i] - '0';
130 for(int i = 0; i < lenb; i++)
131 b[i] = bb[i] - '0';
132 for(int i = 0; i < lenc; i++)
133 c[i] = cc[i] - '0';
134 la = lena, lb = lenb, lc = lenc;
135 if(lb > lc)
136 {
137 lc = lb;
138 tz += lc - lenc;
139 for(int i = lenc; i < lc; i++)
140 {
141 c[i] = 0;
142 }
143 }
144 else if(lb < lc)
145 {
146 lb = lc;
147 ty += lb - lenb;
148 for(int i = lenb; i < lb; i++)
149 {
150 b[i] = 0;
151 }
152 }
153 }
154
155 int main()
156 {
157 //freopen("input.txt", "r", stdin);
158 //freopen("out.txt", "w", stdout);
159 int T;
160 scanf("%d", &T);
161 while(T--)
162 {
163 scanf("%s%s%s", aa, bb, cc);
164 lena = strlen(aa);
165 lenb = strlen(bb);
166 lenc = strlen(cc);
167 init1();
168 //c - a == b
169 if(check(c, a, b, lc, la, lb))
170 {
171 // cout << " c - a ?= b " << deta << endl;
172 tx += deta2, ty += deta3, tz += deta1;
173 printf("%d %d %d\n", tx, ty, tz);
174 continue;
175 }
176 init1();
177 //c*10 - a == b
178 c[lc++] = 0;
179 tz++;
180 if(check(c, a, b, lc, la, lb))
181 {
182 // cout << " c*10 - a ?= b" << endl;
183 tx += deta2, ty += deta3, tz += deta1;
184 printf("%d %d %d\n", tx, ty, tz);
185 continue;
186 }
187 init2();
188 //c - b == a
189 if(check(c, b, a, lc, lb, la))
190 {
191 // cout << " c - b ?= a" << endl;
192 tx += deta3, ty += deta2, tz += deta1;
193 printf("%d %d %d\n", tx, ty, tz);
194 continue;
195 }
196 init2();
197 //c*10 - b == a
198 c[lc++] = 0;
199 tz++;
200 if(check(c, b, a, lc, lb, la))
201 {
202 // cout << " c*10 - b ?= a" << endl;
203 tx += deta3, ty += deta2, tz += deta1;
204 printf("%d %d %d\n", tx, ty, tz);
205 continue;
206 }
207 puts("-1");
208 }
209 return 0;
210 }
2019HDU多校第七场 HDU6646 A + B = C 【模拟】的更多相关文章
- [2019杭电多校第七场][hdu6646]A + B = C(hash)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6646 题意为求a*10x+b*10y=c*10z满足公式的任意一组解x,y,z. 因为c有可能会由a+ ...
- 2019HDU多校第七场 HDU6651 Final Exam
一.题目 Final Exam 二.分析 题目说的比较绕,总之一定要记住,$n$个题目都可以做,至少作对$k$到,但是做题目的人不知道每道题对应的分数. 作为出题人,如果他是田忌,肯定不会去在做题目的 ...
- 2019HDU多校第七场 HDU6656 Kejin Player H 【期望递归】
一.题目 Kejin Player H 二.分析 因为在当前等级$i$,如果升级失败可能会退回到原来的某一等级$x$,相当于就是失败的期望就是$E + (Sum[i-1] - Sum[x-1]) + ...
- 2014多校第七场1005 || HDU 4939 Stupid Tower Defense (DP)
题目链接 题意 :长度n单位,从头走到尾,经过每个单位长度需要花费t秒,有三种塔: 红塔 :经过该塔所在单位时,每秒会受到x点伤害. 绿塔 : 经过该塔所在单位之后的每个单位长度时每秒都会经受y点伤害 ...
- 2014多校第七场1003 || HDU 4937 Lucky Number
题目链接 题意 : 给定一个十进制n,让你转化成某个进制的数,让这个数只包含3 4 5 6这些数字,这个进制就成为n的幸运数字,输出有多少幸运数字,例如19,5进制表示是34,所以5是19的一个幸运数 ...
- 杭电多校第七场 1010 Sequence(除法分块+矩阵快速幂)
Sequence Problem Description Let us define a sequence as below f1=A f2=B fn=C*fn-2+D*fn-1+[p/n] Your ...
- 杭电多校第七场-J-Sequence
题目描述 Let us define a sequence as belowYour job is simple, for each task, you should output Fn module ...
- HDU 6396(2018多校第七场1011) Swordsman
场上场下各种TLE到怀疑人生...经过大佬指点之后才知道要用fread才能过,一般的快读不行... 题意:一个剑客打小怪兽,有n头小怪兽,剑客和小怪兽有m个属性.只有剑客的m个属性都大于等于某个小怪兽 ...
- hdu61272017杭电多校第七场1008Hard challenge
Hard challenge Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) ...
随机推荐
- 【原创】Linux虚拟化KVM-Qemu分析(九)之virtio设备
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...
- C# Dictionaries
Dictionaries 字典 在C# 里是用接口 IDictionary来实现的,最常用的字典就是Dicrtionary<tkey,tvalue>,键值对的形式,和index,item ...
- MAC地址分类
网卡MAC地址作为互联网设备在以太网中身份的唯一标识在以太网通讯中的作用比IP地址还要重要,MAC地址分成两部分,前24位是组织唯一标识符(OUI, Organizationally unique i ...
- 如何在ASP.NET Core 中使用IHttpClientFactory
利用IHttpClientFactory可以无缝创建HttpClient实例,避免手动管理它们的生命周期. 当使用ASP.Net Core开发应用程序时,可能经常需要通过HttpClient调用Web ...
- Apple Watch Series 6 屏幕误触放大后无法还原问题和解决方案
Apple Watch Series 6 屏幕误触放大后无法还原问题和解决方案 shit Apple,只能放大,不能缩小! 解决方案 关闭缩放功能 https://support.apple.com/ ...
- ECMAScript 7 (ES 2016 /ES7 ) Ecma-262 7Edition
Standard ECMA-262 ECMAScript 2016 Language Specification 7th edition (June 2016) http://www.ecma-int ...
- CSS3 & transition & animation
CSS3 & transition & animation https://developer.mozilla.org/en-US/docs/Web/CSS/transition-ti ...
- APP 金刚区图标设计 & UI
APP 金刚区图标设计 & UI https://www.zcool.com.cn/article/ZNzk4Njg0.html
- NGK生态之星空计划启动在即,稀有VAST高兑换比带来高价值!
NGK生态之星空计划启动在即,为了感谢NGK布道者的支持,NGK官方将全力辅助算力市场,开展全新的星空计划,并发行星空币SPC,空投给算力持有者进行额外奖励. 至此,SPC已经顺利完成2轮空投,也初步 ...
- 全网算力总量暴增,SPC能否成为币圈新宠?
据最新数据显示,在经历了本周初(1月11日)的下跌之后,比特币市场在本周四(1月14日)终于出现了反弹并试图突破4万美元,重新向4万美元上方发起挑战. 这也让加密市场的生态建设者重拾信心,重新对数字货 ...