NOIP 2014 解方程

描述

已知多项式方程:

a0+a1x+a2x2+...+anxn=0

求这个方程在[1, m]内的整数解(n 和 m 均为正整数)。

格式

输入格式

输入共 n+2 行。

第一行包含 2 个整数 n、m,每两个整数之间用一个空格隔开。

接下来的 n+1 行每行包含一个整数,依次为a0,a1,a2,...,an

输出格式

第一行输出方程在[1, m]内的整数解的个数。

接下来每行一个整数,按照从小到大的顺序依次输出方程在[1, m]内的一个整数解。

样例1

样例输入1

 
2 10
1
-2
1

样例输出1

 
1
1

样例2

样例输入2

 
2 10
2
-3
1

样例输出2

 
2
1
2

样例3

样例输入3

 
2 10
1
3
2

样例输出3

 
0

限制

对于 30%的数据,0 < n ≤ 2, |ai| ≤ 100,an ≠ 0, m ≤ 100;

对于 50%的数据,0 < n ≤ 100, |ai| ≤ 10100 ,an ≠ 0,m ≤ 100;

对于 70%的数据,0 < n ≤ 100, |ai| ≤ 1010000 ,an ≠ 0,m ≤ 10000;

对于 100%的数据,0 < n ≤ 100, |ai| ≤ 1010000 ,an ≠ 0,m ≤ 1000000。

来源

NOIP2014 提高组 Day2

 

今天重新做了一下NOIP原题,当时啥也不会,就直接输出0,搞了10分,今天看看撑死也就30,50了,用了网上的一种hash法勉强搞到70分,AC的还未看懂,下面给个标准的题解吧,争取早日理解。

30% : 穷举x,判断等式是否成立。

50% : 在30%的做法中加入高精度乘法,加法。不用高精减的原因是,只要把符号相同的项移到等式一边,最后再计算等式两边数值是否相等。同时记得要写秦九韶(霍纳法则)优化。

70% : 根据同余的性质,同余符号两边可以支持同加一个数,同乘一个数。那么可以对等式两边同时对一个数取模,如果同余符号成立,那么原等式有可能成立,反之则筛掉该x。在实际操作时对ai用一个素数取模,然后再穷举x,一边取mod一边运算。于是就可以把单次检验复杂度降为O(n)

复杂度 : O(nm)

100% : 根据二项式定理,f(x+p)在展开后必然可以整理成f(x)+T,其中T为关于p的一个多项式,而在同余(mod p)的环境下,T是可以忽略的,也就是说,那么事实上f(x) mod p就是在[1,m]上的周期函数,那么我们只要预处理出f(0)~f(p-1),就相当于知道了f(x) mod p在该区间上的全部情况。于是我们对上述算法优化,从选一个质数改为选取多个小质数pi进行验证,对每一个pi进行0~(pi-1)的预处理后,就可以筛掉一些x。最后输出剩下的x。

复杂度 : O(+m)

 

原文地址:https://www.cnblogs.com/CXCXCXC/p/4652818.html