Hướng dẫn giải của Bedao Regular Contest 09 - MNUMBER


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Tác giả: bedao

Phân tích biểu thức từ đề bài, ta có: ~c = b^{2} - a^{2}~ ~\rightarrow~ ~c = (b - a) \times (b + a)~

Do đó, ~b - a~ sẽ là ước của ~c~ và ~b + a = \frac{c}{b - a}~.

Ta tiến hành duyệt qua tất cả ước ~u~ của ~c~ sao cho ~u * u \leq c~, với mỗi ước ~u~ như thế ~(u \leq \frac{c}{u}~ vì ~u \times u \leq c)~.

Nếu ~u = b - a~, ~\frac{c}{u} = b + a~. Ta có:

~a = \frac{(u - \frac{c}{u})}{2}~

~b = \frac{(u + \frac{c}{u})}{2}~

Nếu ~a~ và ~b~ nguyên thì đó là kết quả của đề bài (in ra YES cùng cặp số ~a~, ~b~), nếu không tìm được ~a~, ~b~ nguyên thì không tồn tại bất kì giá trị nào thỏa mãn (in ra NO)

Ngoài ra, ta có thể thử với nhiều số khác nhau và nhận thấy các số có tính chất sau đây:

  • Nếu ~C~ là số lẻ và ~C > 1~ đáp án thỏa mãn luôn là ~\frac{(C + 1)}{2}~ và ~\frac{(C + 1)}{2} - 1~.
  • Nếu ~C~ là số chẵn và ~C~ chia hết cho ~4~ thì kết quả là ~\frac{C}{4} + 1~ và ~\frac{C}{4} - 1~.

Riêng trường hợp ~n = 1~, chúng ta phải xét riêng vì đề bài yêu cầu rằng đáp án ~a~, ~b~ phải thuộc khoảng ~[1, 10^9]~.

Code mẫu

#include <bits/stdc++.h>
#define task ""
#define fi first
#define se second
#define fori(i, L, R) for(auto i = (L); i <= (R); ++i)
#define ford(i, L, R) for(auto i = (L); i >= (R); --i)
using namespace std;

void Freopen()
{
    if(fopen(task".INP","r"))
    {
        freopen(task".INP","r",stdin);
        freopen(task".OUT","w",stdout);
    }
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
}

int n;

int32_t main()
{
    Freopen();

    cin >> n;

    if (n == 1) return cout<<"NO", 0;

    if(n % 2 == 1)
    {
        int x = (n + 1)/2;
        cout << "YES\n" << x << " " << x - 1 << endl;
    }
    else
    {
        if(n % 4 != 0)
            cout << "NO";
        else
        {
            int x = 2, y = n / 2;
            int u = (y + x)/2;
            cout << "YES\n" << u << " " << u - 2 << endl;
        }
    }
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.