已知多项式方程:
a0+a1x+a2x2+...+anxn=0
求这个方程在[1,m]内的整数解(n和m均为正整数)。
输入格式
第一行包含2个整数n、m,每两个整数之间用一个空格隔开。
接下来的n+1行每行包含一个整数,依次为a0,a1,a2,...,an。
输出格式
第一行输出方程在[1,m]内的整数解的个数。
接下来每行一个整数,按照从小到大的顺序依次输出方程在[1,m]内的一个整数解。
样例一
input
2 10
1
-2
1
output
1
1
样例二
input
2 10
2
-3
1
output
2
1
2
样例三
input
2 10
1
3
2
output
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≠0an≠0,m≤10000;
对于100%的数据,0<n≤100,|ai|≤1010000,an≠0,m≤1000000。
时间限制:1s
内存限制:128MB
下载
样例数据下载
题目链接:http://uoj.ac/problem/20
解题报告:
hash函数+RP,
选一个性质较好的模数,存数据,算答案,模意义下是否为0.
此题看脸,酋长退群吧.
推荐mod=100000007.youyu
选错了模数,怪我喽.
由于常数巨巨大,据算多项式要用秦九韶算法
https://baike.baidu.com/item/%E7%A7%A6%E4%B9%9D%E9%9F%B6%E7%AE%97%E6%B3%95/449196?fr=aladdin
AC代码:
#include
#include
#include
#include
#include
#define ll long long
#define MOD 100000007
#define FOR(i,s,t) for(register ll i=s;i<=t;++i)
using namespace std;
ll n,m,cnt;
ll a[151];
ll ans[1000011];
char c;
inline ll read(){
ll w=1,data=0;
while(c=getchar(),c!='-'&&(c>'9'||c<'0'));
if(c=='-')
w=-1;
else
data=c-48;
while(c=getchar(),c>='0'&&c<='9')
data=((ll)(data<<1)+(data<<3)+c-48)%MOD;
return w==1?data:(MOD-data);
}
inline ll calc(int r){
ll ans=0,k=1;
ans=a[n];
for(register int i=n-1;i>=0;--i)
ans=((ll)(r*ans)+a[i])%MOD;
return ans;
}
int main(){
n=read();
m=read();
FOR(i,0,n)
a[i]=read();
FOR(i,1,m)
if(!calc(i))
ans[++cnt]=i;
printf("%d\n",cnt);
FOR(i,1,cnt)
printf("%d\n",ans[i]);
return 0;
}