2024“钉耙编程”中国大学生算法设计超级联赛(8)1007 cats 的 k-xor

Problem Description

定义两个数 x,y 的 k-xor 为 x,y 在正整数 k (k≥2) 进制意义下的不进位加法。现在 cats 有两个整数 a,b,cats 算出了它们在某个进制 k 下的 k-xor 为 c。但在 cats 计算出 c 后,cats 忘记了 k 的值。你能帮 cats 算出所有大于等于 2 的可能是 k 的不同正整数个数吗?如果有无穷多个满足条件的 k,输出 −1。

注:两个数在 k 进制下的不进位加法为,将两个数分别写出它们的 k 进制表示,并将两个数对应的位分别相加,然后将每一位相加得到的结果分别对 k 取模,将结果看做一个新的 k 进制数,这个结果即为两个数 k 进制下不进位加法的结果。例如 16=(121)3 和 8=(022)3 在 3 进制下的不进位加法的结果即为 (110)3=12。.

Input

第一行包含一个整数 T (1≤T≤100),表示一共有 T 组测试数据。

每组测试数据包含一行三个整数 a,b,c(0≤a,b,c≤109),表示参与 k-xor 运算的两个数和运算结果。

Output

对于每组测试数据,输出一个整数,表示所有大于等于 2 的可能是 k 的不同正整数个数。如果有无穷多个满足条件的 k,输出 −1。

Sample Input

5
3 5 6
16 8 12
0 0 0
21 21 0
123 456 789

Sample Output

1

2

-1

3

0

思路:这道题分为三种情况:当 a + b < c 时,输出为 0 ;当 a + b = c 时,输出为 -1 ;当 a + b > c 易知 a + b - c 是 k 的倍数,检查 a + b - c 的因子是否满足条件即可。

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define int long long
#define endl '\n'
bool check(int a,int b,int c,int k){
	if(k==1) return false;
	int ans=0,w=1;
	while(a>0 || b>0){
		ans+=w*((a+b)%k);
		a/=k;
		b/=k;
		w*=k;
	}
	if(ans==c) return true;
	return false;
}
signed main()
{
	IOS
	int _;
	cin >> _;
	while(_--){
		int a,b,c;
		cin >> a >> b >> c;
		if(a+b==c){
			cout << -1 << endl;
			continue;
		}
		if(a+b<c){
			cout << 0 << endl;
			continue;
		}
		int cnt=0,x=a+b-c;
		for(int i=1;i<=sqrt(x);i++){
			if(x%i==0){
				if(check(a,b,c,i)) cnt++;
				if(i!=x/i && check(a,b,c,x/i)) cnt++;
			}
		}
		cout << cnt << endl;
	}
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值