秦九韶算法学习笔记

快速求多项式 —— 秦九韶算法

计算 inai×xi 的值。

1. 朴素算法

算出每一项的值再相加,总共要进行 n(n+1)2 次乘法,n 次加法。

2. 秦九韶算法

a0+a1x+a2x2+anxn=(((anx+an1)x+an2)x+a1)x+a0 可以只进行 n 次乘法,n 次加法,大大降低了时间复杂度。

例题

题目描述

已知多项式方程:

a0+a1x+a2x2++anxn=0

求这个方程在 [1,m] 内的整数解(nm 均为正整数)。
对于 100% 的数据:0<n100,|ai|1010000,an0,m<106

对于这道题我们可以利用秦九韶算法求解,枚举 [1,m] 的每一个数,然后将其带入多项式求值,最终如果结果为 0,就记录答案。


#include <bits/stdc++.h>
#define ll long long
using namespace std;

const ll Mod = 1e9 + 7;

inline ll read(){
  	ll f = 1,x = 0;
  	char ch = getchar();
  	while(!isdigit(ch)){
		if(ch == '-')f = -1;
  		ch = getchar();
  	}
  	while(isdigit(ch)){
  		x = (x << 1) + (x << 3) + (ch ^ 48);
  		x %= Mod;
  		ch = getchar();
  	}
  	return x * f;
}
inline void print(int x){
  	if(x > 9)print(x / 10);
  	putchar(x % 10 + '0');
}

ll a[101];
int n, m;

bool check(ll x){
	ll sum = 0;
	for(ll i = n; i >= 1; i--)
		sum = ((a[i] + sum) % Mod * x) % Mod;
	sum = (sum + a[0]) % Mod;
	return !(sum);
}

ll ans[1000010], tot = 0;

signed main(){	
	cin >> n >> m;
	for(int i = 0; i <= n; i++){
		a[i] = read();
	}
	for(ll i = 1; i <= m; i++){
		if(check(i))ans[++tot] = i;
	}
	cout << tot << endl;
	for(int i = 1; i <= tot; i++){
		cout << ans[i] << endl;
	}
  	return 0;
}
posted @   Light_starup  阅读(90)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示