[noip2014]P2312 解方程

P2312 解方程

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

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

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

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

然后你应该可以拿30分。

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

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

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

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

#include 
using 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 解方程)