UOJ #20. 【NOIP2014】解方程

已知多项式方程:

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<n2|ai|100an0m100

对于50%的数据,0<n100|ai|10100an0m100;

对于70%的数据,0<n100|ai|1010000an0an≠0,m10000

对于100%的数据,0<n100|ai|1010000an0m1000000

时间限制: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;
}

  

  

原文地址:https://www.cnblogs.com/Stump/p/7702161.html