Codeforces 233B Non-square Equation (數學) -- 解題報告

題面

題意

給定一個方程,求出 x 的最小正整數解,如果不存在,則輸出 -1 。

解題思路

注意到題目中的 n 的最大值是 1018 ,由公式可以估算出 x 的最大值是 109 ,直接暴力顯然會超時。觀察題目給出的方程:

x2+s(x)xn=0

注意 s(x) 函數,可以發現 s(x) 在 x 取得最大值,即 x = 999999999 時相應地取得最大值,即 81。於是,我們可以去枚舉 s(x) ,計算相應的 x 能否使方程左右兩邊相等,這樣就能大大降低複雜度。我們將原方程化爲左邊是 x 的方程:

x2+s(x)xn+s(x)24=s(x)24(1)

(x+s(x)2)2=s(x)24+n(2)

x+s(x)2=s(x)24+n(3)

x=s(x)24+ns(x)2(4)

這樣,我們只需要從 1 到 81 枚舉所有 s(x),計算出相應的 x,代入方程比較是否相等即可。

參考代碼

#include <cstdio>
#include <cmath>
using namespace std;

// s(x) 函數
int s(long long x) {
    int sum = 0;
    while(x) {
        sum += x%10;
        x /= 10;
    }

    return sum;
}

int main(int argc, char const *argv[]) {
    long long n, ans = -1;
    scanf("%lld", &n);
    for(int i=1; i<=81; ++i) {
        long long x = sqrt(i*i/4+n) - i/2;
        int sx = s(x);
        if(x*x+sx*x-n == 0) {
            ans = x;
            break;
        }
    }
    printf("%lld\n", ans);

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章