c++小 Z 和小 J 想在今天探大案!

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

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img