小 Z 和小 J 希望得到两个正整数 n,m(1≤m≤n)n,m(1≤m≤n),而这两个数已经被人销毁。
但幸运的是,在犯案现场留下了一个分数 xy。根据小 Z 的推测,xy是 1,2,⋯,n1,2,⋯,n 的平均数但 m 中并没有被加入的结果。也就是说,xy 为 1,2,⋯,m−2,m−1,0,m+1,⋯,n1,2,⋯,m−2,m−1,0,m+1,⋯,n 共 n个数的平均数。
小 Z 想知道有哪些可能的初始的数,但不希望直接被人看到,所以请你给出对于所有解把 (n+m)异或起来的答案。
输入格式
第一行包含一个整数 T。
接下来 T 行,每行包含两个整数 x,y。
输出格式
输出 T 行,每行一个整数。假如无解请输出
-1。
样例输入
3
5 5
10 7
8 2
样例输出
5
-1
30
样例解释
对于第一组数据,有 (n,m)=(2,1)或 (3,3)。
对于第三组数据,有 (n,m)=(8,4)或 (9,9)。
数据范围
对于所有的数据,满足 1≤T≤1000,1≤x≤10^18,1≤y≤10^9
对于前 30%的数据,满足 1≤x≤20,1≤y≤5
对于前 60% 的数据,满足 1≤x≤10^8,1≤y≤10000
看不懂再私信我要解释。
void Solve(){
//cin>>x>>y;
x=read();y=read();
int flag=0,ans=0;
for(int i=max((int)1,2*x/y-1),m;i<=2*x/y+1;++i){
m=i*(i+1)/2-i*x/y;
if(1<=m&&m<=i){
if(i*(i+1)*y-2*m*y==2*x*i) ans^=i+m,flag=1;
}
}
if(flag) write(ans),putchar('\n');//cout<<ans<<"\n";
else puts("-1");//cout<<"-1\n";
}
你题目的解答代码如下:
#include <iostream>
using namespace std;
int main()
{
int i, t, x, y, n, m, sum, res;
double f, h;
cin >> t;
while (t > 0)
{
cin >> x >> y;
f = (double)x / y;
res = 0;
if (f >= 1)
{
sum = 0;
n = 0;
while (1)
{
n++;
sum += n;
h = sum - f * n;
if (h > n && n > f)
break;
m = h;
if (m >= 1 && m <= n && h == m)
{
res ^= m + n;
}
}
}
if (res == 0)
cout << -1 << endl;
else
cout << res << endl;
t--;
}
return 0;
}
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!