【题解】 P2312 [NOIP2014 提高组] 解方程
作者:互联网
秦九韶算法
对于式子 \(a_nx^n + a_{n-1}x^{n-1} + \dots + a_1x^1 + a_0\),
可以变形为 \((\dots((a_nx+a_{n-1})x+\dots + a_1)x + a_0\)
做法
枚举 \([1,m]\) 中的所有数作为 \(x\) 带入式子中利用秦九韶算法算出结果,看结果是否为 \(0\) 。
对于系数 \(a_i\) 的输入,可以参照哈希的思想,将其模上一个很大 (至少大于 \(m\))的质数,这里取了\(1000000007\)。
PS: 这种哈希的方法可能会产生哈希冲突,常常有毒瘤出题人会利用这些细节来卡人,这道题的数据比较水,加上本人运气较好,没有产生哈希冲突,经验证:质数 \(10001891\) 会产生哈希冲突,若读者不放心,可以多做几次哈希,减少冲突的可能性。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL N = 105, Mod = 1e9 + 7;
inline LL read()
{
LL x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=((x<<1)+(x<<3)+(ch^48)) % Mod;
ch=getchar();
}
return x*f;
}
LL n,m;
LL cnt = 0;//可行解个数
LL ans[N];
LL a[N];//系数
LL count(LL x)//秦九韶
{
LL res = 0;
for(LL i=n;i>=1;i--) res = ((res + a[i]) * x) % Mod;
res = (res + a[0]) % Mod;
return res;
}
int main()
{
cin>>n>>m;
for(LL i=0;i<=n;i++) a[i] = read();
for(LL i=1;i<=m;i++)
{
if(count(i) == 0)
{
ans[++cnt] = i;
}
}
cout<<cnt<<endl;
for(LL i=1;i<=cnt;i++) cout<<ans[i]<<endl;
return 0;
}
标签:dots,ch,题解,LL,NOIP2014,哈希,res,P2312,Mod 来源: https://www.cnblogs.com/BorisDimitri/p/15158152.html