洛谷P2312 秦九韶算法求多项式点值
题意:
给出序列[a1,a2,a3,...,an][a_{1},a_{2},a_{3},...,a_{n}][a1,a2,a3,...,an],求出下列方程在区间[1,m][1,m][1,m]的解
∑i=0naixi=0\sum_{i=0}^{n}a_{i}x^{i}=0 i=0∑naixi=0
Solution:
显然只需要枚举解,然后检查解是否符合条件即可,但直接多项式求值常数太大,朴素的求值需要n(n+1)2\frac{n(n+1)}{2}2n(n+1)次乘法和nnn次加法。秦九韶算法可以优化至nnn次乘法,nnn次加法
a0+a1x+...+anxn=0a_{0}+a_{1}x+...+a_{n}x^{n}=0 a0+a1x+...+anxn=0
左式有xxx的部分提出xxx
a0+x(a1+...+anxn−1)=0a_{0}+x(a_{1}+...+a_{n}x^{n-1})=0 a0+x(a1+...+anxn−1)=0
括号内的重复这个步骤,一直到
a0+x(a1+x(a2+(....+x(an))))a_{0}+x(a_{1}+x(a_{2}+(....+x(a_{n})))) a0+x(a1+x(a2+(....+x(an))))
从内到外求即可
原题ai<1010000a_{i}<10^{10000}ai<1010000,并且检查解的时候多项式值会很大,不妨在模数下计算这个值,这样在读入aia_{i}ai时就可以快读取模。模数多可以提高正确性,但常数会变大,代码选用了109+710^{9}+7109+7和109+910^9+9109+9两个模数
// #include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<bitset>
#include<map>
using namespace std;using ll=long long;
const int N=105,inf=0x3fffffff;
const long long INF=0x3fffffffffffffff,mod1=1e9+7,mod2=1e9+9;int n,m;
ll a1[N],a2[N];bool check(int x)
{ll ret1=0,ret2=0;for(int i=n;i>=1;i--){ret1=(a1[i]+ret1)%mod1*x%mod1;ret2=(a2[i]+ret2)%mod2*x%mod2;}ret1=(ret1+a1[0])%mod1;ret2=(ret2+a2[0])%mod2;return ret1==0&&ret2==0;
}pair<ll,ll> read()
{ll ret1=0,ret2=0,flag=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-') flag=0;ch=getchar();}while(isdigit(ch)){ret1=(ret1*10+ch-48)%mod1;ret2=(ret2*10+ch-48)%mod2;ch=getchar();}return flag?make_pair(ret1,ret2):make_pair(-ret1,-ret2);
}int main()
{#ifdef stdjudgefreopen("in.txt","r",stdin);#endifvector<int>ans;n=read().first; m=read().first;for(int i=0;i<=n;i++){auto tmp=read();a1[i]=tmp.first;a2[i]=tmp.second;}for(int i=1;i<=m;i++)if(check(i)) ans.push_back(i);cout<<ans.size()<<'\n';for(int i:ans) printf("%d\n",i);return 0;
}
洛谷P2312 秦九韶算法求多项式点值相关推荐
- [计算机数值分析]利用秦九韶算法求多项式的值
Spring-_-Bear 的 CSDN 博客导航 例:利用秦九韶算法求 p ( x ) = x 5 − 3 x 4 + 4 x 2 − x + 1 p(x)=x^{5}-3x^{4}+4x^{2}- ...
- Python使用秦九韶算法求解多项式的值
----------喜大普奔---------- 1.董付国老师Python系列教材,亚马逊.京东.当当.天猫均有销售: 1)<Python程序设计(第2版)>(2018年5月第6次印刷) ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
- 洛谷P2312解方程题解
题目 暴力能得\(30\),正解需要其他的算法操作,算法操作就是用秦九韶算法来优化. 秦九韶算法就是求多项式的值时,首先计算最内层括号内一次多项式的值,然后由内向外逐层计算一次多项式的值,然后就将求\ ...
- 信息学奥赛一本通 1956:【11NOIP普及组】表达式的值 | 洛谷 P1310 [NOIP2011 普及组] 表达式的值
[题目链接] ybt 1956:[11NOIP普及组]表达式的值 洛谷 P1310 [NOIP2011 普及组] 表达式的值 [题目考点] 表达式树 由带括号的中缀表达式构建表达式树 [解题思路] 思 ...
- 利用Kuhn-Munkras算法求最小权值匹配
本文参考博客: http://blog.csdn.net/zhangpinghao/article/details/12242823(代码参考该博客) http://philoscience.itey ...
- 洛谷P2312解方程
传送门 思路分析 怎么求解呢? 其实我们可以把左边的式子当成一个算式来计算,从1到 $ m $ 枚举,只要结果是0,那么当前枚举到的值就是这个等式的解了.可以通过编写一个 $ bool $ 函数来判断 ...
- 洛谷题单 算法1-3 暴力枚举
1 First Step (ファーストステップ) 题目背景 知らないことばかりなにもかもが(どうしたらいいの?) 一切的一切 尽是充满了未知数(该如何是好) それでも期待で足が軽いよ(ジャンプだ!) ...
- 秦九韶算法计算多项式
方法1:直接模拟累加. 题目条件:n为最高的次数,a数组为系数,x为给定的值. double f(int n,double a[],double x) {int i;double p=a[0];for ...
最新文章
- javascript、jQuery的扩展方法,扩展实例展示代码
- SDNU 1462.时间转换
- python基础代码库-Python基础数据处理库-NumPy
- Adobe宣布不再针对iPhone开发Flash工具
- IDE之Eric:Python的IDE之eric的简介、安装、使用方法之详细攻略
- 科大星云诗社动态20210506
- XCTF-Reverse:python-trade
- C++读取INI文件
- java cxf 工具_利用CXF工具开发WebService接口
- SharePoint 2013 中自定义WCF服务
- 【python基础知识】对文本数据库的一些基本操作
- 谷歌更新漏洞披露规则:不管补丁打没打,够90天才披露
- EJB3.0高速入门项目开发步骤
- css中如何设置字体
- Django:学习笔记(9)——用户身份认证
- 分智- 招聘,公司评论,晒工资,薪水
- Javascript上传图片转base64并预览
- 未能在sysindexes中找到数据库ID11中对象ID1的索引ID1对应的行,请对sysindexes运行
- Pytorch创建多任务学习模型
- 文明与征服北条时宗最强阵容搭配指南