Code jam 2022 Round 1C Squary

https://codingcompetitions.withgoogle.com/codejam/round/0000000000877b42/0000000000afdf76#problem

数学题,利用和的平方与平方的和以及交叉项的关系求解。

可以在k<=2的范围内得到一个有效的解。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int m_index = 0;

LL BinarySearch(LL l, LL r, bool up, LL sum, LL square_sum)
{
    while (l <= r)
    {
        LL mid = (r - l) / 2 + l;
        if ((sum + mid)*(sum + mid) == square_sum + mid * mid)
            return mid;
        else if ((sum + mid)*(sum + mid) > square_sum + mid * mid)
        {
            if (up)
                r = mid - 1;
            else
                l = mid + 1;
        }
        else
        {
            if (up)
                l = mid + 1;
            else
                r = mid - 1;
        }
    }
    return 0;
}
void YD()
{
    m_index++;

    int n, k;
    cin >> n >> k;

    vector<LL> nums(n);
    for (int i = 0; i < n; i++)
    {
        cin >> nums[i];
    }
    LL sum = 0;
    LL squre_sum = 0;
    for (int i = 0; i < n; i++)
    {
        sum += nums[i];
        squre_sum += (nums[i] * nums[i]);
    }
    if (sum*sum == squre_sum)
    {

        cout << "Case #" << m_index << ": " << 0 << endl;
        return;

    }
    if (sum == 0)
    {
        
        cout << "Case #" << m_index << ": " << "IMPOSSIBLE" << endl;
        return;

        
    }
    LL res = 0;
    res = (squre_sum - sum * sum) / 2 / sum;

    if((sum+ res)*(sum+ res)==squre_sum+res*res)
    {

        cout << "Case #" << m_index << ": " << res << endl;
        return;

    }
    else
    {
        if(k==1)
        cout << "Case #" << m_index << ": " << "IMPOSSIBLE" << endl;
        else
        {

            LL n1=1-sum;
            sum+=n1;
            squre_sum+=n1*n1;
            LL sp=(sum*sum-squre_sum)/2;
            LL n2=-sp;
            cout << "Case #" << m_index << ": " <<n1<<' '<<n2<<endl;
        }
    }
    


}
int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        YD();
    }
}
View Code

 

posted @ 2022-05-01 17:00  80k  阅读(46)  评论(0)    收藏  举报