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;
}