已知多项式方程:
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<cstdio> #include<iostream> #include<cstring> #include<string> #include<cmath> #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 ",cnt); FOR(i,1,cnt) printf("%d ",ans[i]); return 0; }