码迷,mamicode.com
首页 > 其他好文 > 详细

[noip2014]P2312 解方程

时间:2019-11-09 17:14:08      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:复杂   http   namespace   技巧   baidu   targe   long   tar   高精度   

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 解方程

标签:复杂   http   namespace   技巧   baidu   targe   long   tar   高精度   

原文地址:https://www.cnblogs.com/zcr-blog/p/11826651.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!