2019杭电暑期多校第七场 A:A + B = C(思维)

这道题目要求找到x,y,z使A*x + B*y = C*z成立。通过分析A+B=C的情况,可以得出四种可能的x,y,z:b|(c-a), b|(10*c-a), a|(c-b), a|(10*c-b),并且要求商是10的倍数。通过逐个判断这些条件,可以解决这个问题。题解中还提到了a+b=c的两种基本情形,分别是相同位数和不同位数的情况,这两种情况各有两种组合方式,总共四种组合。" 112730071,10292952,循环矩阵在聚类与图像匹配算法中的应用,"['图像处理', '模式识别', '数据挖掘', '机器学习', '图像匹配算法']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题解】

题意:给定a,b,c,找到一个x,y,z使得 a*10^x+b*10^y=c*10^z ,否则输出-1。

思路:我们知道对于A+B=C,要么A+B对于最高位有进一位,那么C的最高位是max(A的最高位,B的最高位)+1;要么A+B没有进位,C的最高位是max(A的最高位,B的最高位)。所以,补零到 a,b,c 长度相等之后, 可能的情况只有四种: b | (c−a),b | (10·c−a),a | (c−b),a | (10·c−b),且商为10的倍数,逐个判断即可。

adds : 首先,a+b=c有两种情况,一种情况就是 c和a、或b、或者a和b,都是一样的位数,比如123+50=173,50+123=173,123+456=579,另一种情况就是c比a、或b、或者a和b、多一位,比如99+3=102,3+99=102,99+30=129。每种情况a和b调换位置(如果位数不同)又有两种,所以总共有四种。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+5,lim=3e5;
int a[maxn],b[maxn],c[maxn],d[maxn];
char A[maxn],B[maxn],C[maxn];
int check(int c[],int lc,int a[],int la,int b[],int lb)
{   //假设a+b*10^x=c,判断b是否整除c-a
    int i;
    for(i=0;i<lim;i++)
        if(c[i]!=a[i]){
            if(c[i]<a[i]) return -1;
            break;
        }
    for(i=
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值