A−B数对

题目描述
出题是一件痛苦的事情!

题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+BA+B ProblemProblem,改用A-BA−B了哈哈!

好吧,题目是这样的:给出一串数以及一个数字CC,要求计算出所有A-B=C的数对的个数。(不同位置的数字一样的数对算不同的数对)

输入输出格式
输入格式:
第一行包括22个非负整数NN和CC,中间用空格隔开。

第二行有NN个整数,中间用空格隔开,作为要求处理的那串数。

输出格式:
输出一行,表示该串数中包含的所有满足A-B=CA−B=C的数对的个数。

输入输出样例
输入样例#1:
4 1
1 1 2 3
输出样例#1:
3
说明
对于73%的数据,N ≤ 2000;
对于100%的数据,N ≤200000。
所有输入数据都在longint范围内。

.
.
.
.
.
.
分析
我用了哈希来做,数组开得够大
注意:所有输入数据都在longint范围内!
这说明int可能会爆,并且,它可能会有负数
所以哈希的做法要注意一下
.
.
.
.
.
程序:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long mo=1555553;
long long h[1555553][2],a[1555553];
long long tj=0,ans=0;


long long abs(long long x)
{
	return x<0?-x:x;
}

int find(int x)
{
	long long w=abs(x)%mo,i=0;
	while (i<mo&&h[(w+i)%mo][0]!=-1&&h[(w+i)%mo][0]!=x) i++;
	if (h[(w+i)%mo][0]==x) return (w+i)%mo;
}

inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<='0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}

void hash(int x)
{
	long long w=abs(x)%mo,i=0;
	while (i<mo&&h[(w+i)%mo][0]!=-1&&h[(w+i)%mo][0]!=x) i++;
	if (h[(w+i)%mo][0]==-1)
	{
		h[(w+i)%mo][0]=x;
		h[(w+i)%mo][1]++;
		tj++;
		a[tj]=x;
	} else
	if (h[(w+i)%mo][0]==x) h[(w+i)%mo][1]++;
}

int main()
{
	int n,c;
	n=read();c=read();
	memset(h,-1,sizeof(h));
	for (int i=1;i<=n;i++)
	{
		long long w;
		w=read();
		hash(w);
	}
	sort(a+1,a+tj+1);
	for (int i=1;i<=tj;i++)
	{
		int w=find(a[i]+c),z=find(a[i]);
		if (h[w][0]==a[i]+c&&h[z][0]==a[i]) ans=(long long)ans+(long long)(h[z][1]+1)*(long long)(h[w][1]+1);	
	}
	printf("%lld",ans);
	return 0;
}
### 初等变换求矩阵 A⁻¹B 的方法 在矩阵运算中,计算 $ A^{-1}B $ 是常见的线性代问题,尤其在解线性方程组 $ AX = B $ 时非常关键。通过初等行变换的方法,可以高效地求解 $ A^{-1}B $,而无需显式地先求出 $ A^{-1} $。 #### 厺本原理 利用初等行变换求解 $ A^{-1}B $ 的核心思想是将矩阵 $ A $ 转换为单位矩阵 $ I $,同时对矩阵 $ B $ 应用相同的行变换。当 $ A \to I $ 时,$ B \to A^{-1}B $。这可以通过构建增广矩阵 $[A | B]$ 并进行行变换实现。 具体过程如下: - 构建增广矩阵 $[A | B]$,其中 $ A $ 是 $ n \times n $ 可逆矩阵,$ B $ 是 $ n \times m $ 矩阵。 - 对增广矩阵进行初等行变换,将 $ A $ 部分转化为单位矩阵 $ I $。 - 最终增广矩阵变为 $[I | A^{-1}B]$,右侧即为所求结果。 #### 示例代码 以下是一个使用 Python 和 NumPy 进行此计算的示例: ```python import numpy as np def compute_A_inv_B(A, B): # 确保 A 是可逆的 if np.linalg.det(A) == 0: raise ValueError("Matrix A is singular and cannot be inverted.") # 构建增广矩阵 [A | B] augmented_matrix = np.hstack((A, B)) # 使用高斯-约当消元法将增广矩阵的 A 部分转换为单位矩阵 n, m = augmented_matrix.shape for i in range(n): # 归一化当前行,使主元为 1 pivot = augmented_matrix[i, i] augmented_matrix[i, :] /= pivot # 消去其他行中的当前列 for j in range(n): if i != j: factor = augmented_matrix[j, i] augmented_matrix[j, :] -= factor * augmented_matrix[i, :] # 提取 A⁻¹B A_inv_B = augmented_matrix[:, n:] return A_inv_B # 示例矩阵 A = np.array([[4, 7], [2, 6]]) B = np.array([[1, 2], [3, 4]]) # 计算 A⁻¹B result = compute_A_inv_B(A, B) print("A⁻¹B =") print(result) ``` #### 注意事项 - 矩阵 $ A $ 必须是可逆的(即行列式不为零)。 - 初等行变换过程中应保持矩阵的结构不变,以确保变换的正确性。 - 实际应用中,使用值库(如 NumPy)可以更高效地处理此类问题。 #### 理论依据 - 初等行变换可以保持矩阵的行空间不变,从而确保变换后的结果仍然对应于原始问题的解。 - 通过将 $ A $ 转换为单位矩阵,可以同时对 $ B $ 进行相同的变换,从而得到 $ A^{-1}B $。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值