首页 > 其他分享 >X 进制减法

X 进制减法

时间:2024-02-26 19:22:23浏览次数:26  
标签:tmp ch 进制 Mb int 减法 MOD

一、题目描述

P8782 [蓝桥杯 2022 省 B] X 进制减法

二、算法简析

首先,要弄清楚如何转换为十进制。先来看二进制数 \(a_na_{n-1}...a_0\),转换为十进制为 \(a_n2^{n}+a_{n-1}2^{n-1}+···+a_02^0\)。
当不同位的进制不同时,公式是不同的。令 \(a_i\) 为 \(n_i\) 进制,则 \(a_ia_{i-1}...a_0\) 中的 \(a_i\) 转换为十进制为 \(a_i\prod_0^{i-1}n_i\),以此类推求出 \(a_{i-1}...a_0\),再相加。
321 为例,最低位为二进制,第二位为十进制,第三位为八进制。该数转换为十进制为 \(3\times 20+2 \times 2 + 1 = 65\)。
接着,再来看本题,要我们求 \(A-B\) 的最小值。我们采用贪心,使 \(A\) 和 \(B\) 转换为十进制的值最小,也就是说使每位的进制尽量小。每一位的进制为:

\[\begin{cases} \text{max}(A[i], B[i]) + 1&, A[i],~B[i]\geq 2 \\ 2&,A[i],~B[i]<2 \end{cases} \]

值得注意的是,\(A\) 和 \(B\) 的位数可能不相同,但都必须是低位对齐。

三、本体代码

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int MAX = 1e5 + 5;
const int MOD = 1e9 + 7;

int N, Ma, Mb, A[MAX], B[MAX], C[MAX];
int a, b;

int quickin(void)
{
	int ret = 0;
	bool flag = false;
	char ch = getchar();
	while (ch < '0' || ch > '9')
	{
		if (ch == '-')    flag = true;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9' && ch != EOF)
	{
		ret = ret * 10 + ch - '0';
		ch = getchar();
	}
	if (flag)    ret = -ret;
	return ret;
}

int main()
{
	#ifdef LOCAL
	freopen("test.in", "r", stdin);
	#endif
	
	N = quickin();
	// A和B的位数可能不同,但都是低位对齐 
	Ma = quickin();
	for (int i = Ma - 1; i >= 0; i--)
		A[i] = quickin();
	Mb = quickin();
	for (int i = Mb - 1; i >= 0; i--)
		B[i] = quickin();
	
	int cj = 1;
	for (int i = 0; i < Ma || i < Mb; i++)
	{
		int tmp = 0;
		if (i < Ma)
			tmp = max(tmp, A[i]);
		if (i < Mb)
			tmp = max(tmp, B[i]);
		
		tmp = tmp < 2 ? 2 : tmp + 1;
		C[i] = cj;
		cj = (ll)cj * tmp % MOD;
	}
	
	for (int i = 0; i < Ma || i < Mb; i++)
	{
		if (i < Ma)
			a = ((ll)A[i] * C[i] % MOD + a) % MOD;
		if (i < Mb)
			b = ((ll)B[i] * C[i] % MOD + b) % MOD;
	}
	
	// (a - b + MOD) % MOD 保证余数不小于0 
	cout << ((ll)a - b + MOD) % MOD << endl;
	
	return 0;	
} 

标签:tmp,ch,进制,Mb,int,减法,MOD
From: https://www.cnblogs.com/hoyd/p/18035002

相关文章

  • 62进制的大数相加
    1.#62进制的大数相加//实现两个62进制数的大数加法//输入:两个62进制数,String类型,仅考虑整数//输出:两数之和,String类型//62进制数:按照1-9,a-z,A-Z递增functionsum(a,b){}不知道你们看到这道题时是什么感受!!!我当时的想法是:“好像只听过2进制、8进制、16......
  • 第二章 二进制
    二进制可以表示计算机信息,是由于IC的一个引脚只能表示两种状态(决定计算机的信息数据只能由二进制数来处理)二进制数的倍数一般是8的倍数,八位二进制数被称为一个字节(字节是最基本的信息计量单位)。对于字节处理数据时还需要关注一些点:比如数据小于储存数据的字节数,那么高位上就用零填......
  • C# 的浮点类型 float double 和十进制类型 decimal
    //浮点型数据floatdouble(双精度)//floatf=1.1;//ps:写小数的时候只要后面没有加上f/F默认是double类型//正确的定义doubled=1.1;floatf=1.1F;floatf1=1f;//f=d;//ps......
  • Linux中在其他目录执行二进制文件
    Linux命令行中执行命令一般通过:./xxxx的方式,但前提是必须先进入二进制文件所在的目录(或者更上一层级的目录),如果在其他不相关的目录就不能通过这种方式执行。所以,最简单的方法是:查看当前的环境变量:echo$PATH,在列出的环境变量中选择一个目录,如:/home/xxx/bin,将文件放入这个目录,之后......
  • 10进制转16进制再转2进制
    提问如何10进制转16进制再转2进制回答staticintHexString2BinString(objectvalue,intindex,intlength){try{if(int.TryParse(value.ToString(),outintintValue)){varhexString=intValue.ToString("X4");......
  • 尝试从Ubuntu的deb包里提取出来二进制文件移到安卓上 最终发现不可行
    https://packages.ubuntu.com/en/focal/arm64/fastboot/downloadhttps://packages.ubuntu.com/focal/arm64/tree/download这个页面不能下载Youcandownloadtherequestedfilefromthe pool/universe/t/tree/ subdirectoryatanyofthesesites:Notethatinsomebro......
  • JS 中的二进制 - Blob 与 ArrayBuffer
    零、参考资料《图解+实战》File、Blob、TypedArray、DataViewJavaScript也有操作二进制的一天:聊ArrayBuffer和Blob聊聊JS的二进制家族:Blob、ArrayBuffer和Buffer一、定义宏观:Blob-表示一个不可变、原始数据的类文件对象,可读不可写微观:ArrayBuffer-表示通用的原始......
  • 十六进制字符串,转化为十六进制数据并write 写出去
    如果你想使用write函数以十六进制方式发送数据,你需要将十六进制数据转换为字节,并将字节作为参数传递给write函数。下面是一个示例程序,演示如何将十六进制字符串转换为字节,并使用write函数发送数据:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<st......
  • 数据是用二进制数表示的
    提到计算机,可定会想到二进制。为什么计算机要是用二进制?本章就是来学习二进制的。计算机的内部是由IC【集成电路的简称】这种电子部件构成的,而二进制并不是专门为了计算机而发明的,计算机使用二进制只是与IC的特性相符合。二进制数的位数就是8的倍数【这是因为计算机处理信息的基......
  • Go-embed把静态文件打包到二进制
    同级目录建立view文件夹。packagemainimport( "bytes" "embed" "encoding/json" "fmt" "github.com/gin-gonic/gin" "html/template" "io/ioutil" "net/http")const( gptUrl......