LuoguP2312 [NOIP2014 提高组] 解方程 - 秦九韶算法

秦九韶算法

秦九韶算法是由中国古代数学家秦九韶提出来的多项式算法,将一个一般多项式化为若干个一次多项式计算。优点很明显:不用乘方了。具体操作如下:

a0+a1x+a2x2+a3x3++anxn

=a0+x(a1+a2x+a3x2++anxn1)

=a0+x(a1+x(a2+a3x++anxn2))

=a0+x(a1+x(a2+x(+x(an1+anx))))

可以理解成,每次把多项式非常数项的项拎出来,把 x 提出来,然后把拎出来的那些项又看作新的多项式递归下去……

LuoguP2312 [NOIP2014 提高组] 解方程

就是利用的秦九韶算法。不断带入数字验证答案是否正确。本来想写重载运算符的,但写出来错了QAQ。

code:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const LL P=1e9+7;
LL n,m,ans,key[1000055],A[105];
LL read(){
	LL ll=0,f=1;char ch;
	while(!isdigit(ch=getchar()))if(ch=='-')f=-1;
	do ll=(ll*10%P+ch-'0')%P;while(isdigit(ch=getchar()));
	return ll*f;
} 
bool F(LL x){
	LL sum=0;
	for(LL i=n;i>=1;i--) sum=((A[i]+sum)%P*x)%P;
	sum=(sum+A[0])%P;return !(sum);
}
signed main(){
	n=read(),m=read();
	for(LL i=0;i<=n;i++) A[i]=read();
	bool flag=true;
	for(LL i=1;i<=m;i++)
		if(F(i)) flag=false,ans++,key[ans]=i;
	if(flag){puts("0");return 0;}
	printf("%lld\n",ans);
	for(LL i=1;i<=ans;i++)
		printf("%lld\n",key[i]);
	return 0;
}
posted @   robinyqc  阅读(72)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示