题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6646

题目


解题思路:


(1)先把a,c的末尾补零(a,b都是用数组存的),使它们的长度相同,比如3e5,补零后的a[]对应A[],b[]对应B[]。

那么问题转化为,判断b能否整除(C-A),且除数是10的倍数。

但是A+M=C,可能会产生进位,所以对于这个式子还需要分C是否有进位,所以A和C都要从下标1开始存数,当C有进位时,A还要考虑A[0]的0,所以A[0]和C[1]对应,A[1]和C[2]对应。

一些细节:

1.如果A和C的对应位,第一个不相同的数A[i]>C[i],那么这种情况下肯定无解;

2.(C-A)进行的是不借位的减法,有些位上可能是负数,要从后往前处理,得到正确的(C-A)的值;

3.(C-A)的值可能会有很多前导0,要从第一个非0的位开始和b对应位上的数开始比较,不相等那么b就无法整除(C-A);

4.有可能C的很末尾上的数不为0,但A的很末尾上的数为0, 那么(C-A)很末尾上的数就不为0,这样的话b还是无法整除(C-A)(不过这种情况不用判断也不会wa)

(2)先把b,c末尾补零,使其长度为3e5,分别对应B[],C[],对同样分C有进位和C无进位两字情况判断a能否整除(C-B),和(1)同理。

虽然长度定的是3e5,但是A[],B[],C[]都至少开4e5左右才不会System Error,有点迷?

ac代码:


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 3e5;
const int maxx = 1e5+5;
const int maxt = 4e5;
char a[maxx], b[maxx], c[maxx];
int A[maxt], B[maxt], C[maxt], D[maxt];// 因为会达到A[3e5] 下标从1开始的话
int judge(int A[], int B[], int C[], int lenb) // 传入A+1或者A
{// A + B * 10^x = C 判断C-A能否在整除Bfor(int i = 0; i < maxn; i++) // 末尾补全0后A和C的总长度都是maxn,B的长度也是maxnif(A[i] != C[i]){if(C[i] < A[i]) return -1;// 从高位起, 第一个不相等的数C[i] < A[i],无解break;}for(int i = 0; i < maxn; i++) D[i] = C[i] - A[i];for(int i = maxn - 1; i> 0; i--) // 从低位开始if(D[i] < 0){D[i - 1]--;D[i] += 10; //消除进位}int id = 0;while(!D[id] && id < maxn) id++;// 找到D[i]第一个非0的位for(int i = 0; i < lenb; i++)if(D[id + i] != B[i])return -1;//不能整除for(int i = lenb; i < maxn; i++)if(D[id+i]) return -1;//C[i]-A【i】的末尾可能有非0的数,当然不加这个判断也不会wareturn maxn - lenb - id;
}
int main()
{//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);int t, res;scanf("%d", &t);while(t--){memset(A, 0, sizeof(A));memset(B, 0, sizeof(B));memset(C, 0, sizeof(C));scanf("%s%s%s", a, b, c);int lena = strlen(a), lenb = strlen(b), lenc = strlen(c);for(int i = 0; i < lena; i++) A[i + 1] = a[i] - '0';for(int i = 0; i < lenb; i++) B[i + 1] = b[i] - '0';for(int i = 0; i < lenc; i++) C[i + 1] = c[i] - '0';if((res = judge(A + 1, B + 1, C + 1, lenb)) != -1)// A + B*10^x = C,C无进位{printf("%d %d %d\n", maxn - lena, res, maxn - lenc);continue;}if((res = judge(A, B + 1, C + 1, lenb)) != -1)//  A + B*10^x = C,C有进位{printf("%d %d %d\n", maxn - lena - 1, res, maxn - lenc);continue;}if((res = judge(B + 1, A + 1, C + 1, lena)) != -1)// A *10^x + B = C ,C无进位{printf("%d %d %d\n", res, maxn - lenb, maxn - lenc);continue;}if((res = judge(B, A + 1, C + 1, lena)) != -1 )// A *10^x + B = C ,C有进位{printf("%d %d %d\n",res, maxn - lenb - 1, maxn - lenc);continue;}printf("-1\n");}return 0;
}

【2019杭电多校第七场1001=HDU6646】A+B=C(思维+多细节)相关推荐

  1. 2019杭电多校 第七场 Kejin Player 6656(求期望值)

    2019杭电多校 第七场 Kejin Player 6656(求期望值) 题目 http://acm.hdu.edu.cn/showproblem.php?pid=6656 题意 给你n,q.表示有n ...

  2. 2019杭电多校第七场 HDU - 6656 Kejin Player 期望

    题目链接:https://vjudge.net/problem/HDU-6656 题解: 维护一个前缀sum[i] : 从1到 i 的期望 第 i 到达 i + 1是:ai + (1 - r[i] / ...

  3. 2019杭电多校第七场 HDU - 6656 Kejin Player——概率期望

    题意 总共有 $n$ 层楼,在第 $i$ 层花费 $a_i$ 的代价,有 $pi$ 的概率到 $i+1$ 层,否则到 $x_i$($x_i \leq 1$) 层.接下来有 $q$ 次询问,每次询问 $ ...

  4. 2019杭电多校第七场 Kejin Player HDU - 6656 (期望)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6656 题意:一种游戏,从i级升到i+1级,需要氪金a[i]RMB,有的概率成功,有1-的概率变成x[i ...

  5. 杭电多校第七场 1011 Kejin Player HDU(6656)

    杭电多校第七场 1011 Kejin Player 题意:给你N行,代表从i级有花费a[i]元的r[i]/s[i]的概率达到i+1级,剩下的概率中可能会到达x[i]级.然后询问从L级到R级的花费会是多 ...

  6. 2019杭电多校第9场1002 Rikka with Cake HDU6681

    2019杭电多校第9场1002 Rikka with Cake HDU6681 题意:给你若干个点按上下左右切割平面,最后问平面内有几块被切割开来. 解法1:红黑树+思维+贪心 A:根据欧拉定理可以得 ...

  7. 【2019.08.21】2019杭电多校第十场

    补题地址:http://acm.hdu.edu.cn/listproblem.php?vol=58 题号:6691-6701 1001: 1002: 1003:✅ 1004: 1005:✅ 1006: ...

  8. 2019 杭电多校第六场 题解

    比赛记录 注意随机数据 ,1-n排列这种,一般都有啥暴力重构之类的方法,期望重构次数很少之类的 1005也是这样,因为n^2但只有n个值有数,所以就可以n^2logn 题解 1001 Salty Fi ...

  9. 2019杭电多校第三场 6608 Fansblog(威尔逊定理+miller_rabin素性测试)

    Problem Description 传送门 Farmer John keeps a website called 'FansBlog' .Everyday , there are many peo ...

  10. 2019 杭电 多校第3场 1006 Fansblog (HDU 6608)

    题目链接 题解: 用威尔逊定理变换,然后求逆元. 代码: #include <bits/stdc++.h> using namespace std; typedef long long l ...

最新文章

  1. Java实现最小堆一
  2. Rundll32.exe文件详解(显示我的电脑 取消自动登录)
  3. border-radius圆角兼容方案
  4. python中for和while区别_Python学习第九篇——while和for的区别
  5. 基础省选+NOI-第7部分 概率统计与多项式
  6. python面试1000题之1-3
  7. 【flink】Flink 中的木桶效应:单个 subtask 卡死导致整个任务卡死
  8. 2013年想学的东西。。。
  9. java 读写mysql_Java读写MySQL数据库小实例
  10. 双线macd指标参数最佳设置_MACD“双线合一”抄底法:等待个股最佳买点的出现,及时买进...
  11. python获取指定字符串中重复模式最高的字符串
  12. 福特dms系统服务器,长安福特DMS使用规范.pdf
  13. Openwrt下ipk包的安装、卸载与更新
  14. 郭天祥的10天学会51单片机_第八节
  15. 简易数据分析 04 | Web Scraper 初尝--抓取豆瓣高分电影
  16. 【转】什么是预研?产品预研与技术预研
  17. matlab中的plot函数
  18. Linux C语言 创建一个简单的守护进程
  19. 这些外企,还在招人!
  20. 106个汉语多音字一句话总结!

热门文章

  1. getElementsByName和getElementByID
  2. Unity接入Facebook SDK--android篇
  3. java 打印日志乱码
  4. pip 换源为阿里云
  5. java mp4转码 h264_10分钟学会Jave视频转码avi--gt;mp4(h264编码格式)!_Java_七九推...
  6. mysql连接不用数据库名称_C++连接MySQL数据库
  7. 日报管理系统_设备维护管理系统的自动化报告功能
  8. 单片机自动浇花器答辩记录_一个塑料瓶一颗螺丝,教你做自动浇花器,再不担心花草没人浇水了...
  9. 行政管理专业考计算机研究生分数,行政管理学,考研,历年分数线是多少?
  10. 新的文档类型定义模型带来的问题--javascirpt/CSS