[noip2014]P2312 解方程

Posted zcr-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[noip2014]P2312 解方程相关的知识,希望对你有一定的参考价值。

P2312 解方程

其实这道题就是求一个1元n次方程在区间[1, m]上的整数解。

我们枚举[1, m]上的所有整数,带进多项式中看看结果是不是0即可。

这里有一个技巧就是秦九韶算法,请读者自行查看学习。

时间复杂度O(n*m)。

然后你应该可以拿30分。

我们发现这些数都太大了,要开高精度。然后你愉快地拿了50分——复杂度O(n*m*length)会爆炸。

这里我们考虑hash的思想,对结果取模(最好是一个很大的质数P),如果结果是零就说明这是一个解。

应为如果结果是零,那么要么这是一个解,要么结果是p的倍数(这样的概率很小,小到不需要考虑)。

如果你运气真的不好,就多试几个不同的质数。如果这还不行,你就可以去买彩票了#include <iostreausing namespace std;

const long long p = 1e9 + 7; 

long long n, m, a[110], ans[1000010], cnt;

long long read() {
    //读入时要取模
        long long ret = 0, f = 1;
    char ch = getchar();
    while (!isdigit(ch)) {
        if (ch == -) f = -1;
        ch = getchar();
    }
    while (isdigit(ch)) {
        ret = (ret * 10 + ch - 0) % p;
        ch = getchar();
    }
    return ret * f;
}



int main() {
    cin >> n >> m;
    for (long long i = 0; i <= n; i++) {
        a[i] = read();//这里不能直接读入(这不是快读)
    }
    for (long long i = 1; i <= m; i++) {
        long long x = i, fx = 0;
                //秦九韶算法
        for (long long j = n; j >= 0; j--) {
            fx = ((a[j] + fx) * x) % p;
        }
        if (fx == 0) {
            ans[++cnt] = x;
        }
    }
    cout << cnt << endl;
    for (long long i = 1; i <= cnt; i++) {
        cout << ans[i] << endl;
    }
    return 0;
}

 

以上是关于[noip2014]P2312 解方程的主要内容,如果未能解决你的问题,请参考以下文章

[NOIP2014] 提高组 洛谷P2312 解方程

[NOIP2014提高组]解方程

P2312 解方程

P2312 解方程

P2312 解方程

洛谷 P2312 解方程