P2312 解方程

我借鉴了一下某位不愿透露姓名的丁大佬的代码,他讲了一遍。。。但是我并没有听懂

这个题目呢我们用到了秦九韶算法

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。 把一个n次多项式   P2312 解方程 随笔 第1张   改写成如下形式: P2312 解方程 随笔 第2张   P2312 解方程 随笔 第3张   P2312 解方程 随笔 第4张   P2312 解方程 随笔 第5张   P2312 解方程 随笔 第6张   P2312 解方程 随笔 第7张   求多项式的值时,首先计算最内层括号内一次多项式的值,即   P2312 解方程 随笔 第8张   P2312 解方程 随笔 第9张   然后由内向外逐层计算一次多项式的值,即   P2312 解方程 随笔 第10张   P2312 解方程 随笔 第11张   P2312 解方程 随笔 第12张   P2312 解方程 随笔 第13张   这样,求n次多项式f(x)的值就转化为求n个一次多项式的值。   结论:对于一个n次多项式,至多做n次乘法和n次加法。

 

代码:

#include <cstdio>
const long long Mod = (int)1e9 + 7;
const int maxN = 100 + 5;
const int maxM = (int)1e6 + 5;

int N, M;
int arr[maxN];

void Fscan(int &tmpX) 
{
int Ch = getchar(), F = ' '; long long tmp = 0; while (Ch < '0' || Ch > '9')
{ F
= Ch; Ch = getchar(); } while ('0' <= Ch && Ch <= '9')
{ tmp
= ((tmp << 3) + (tmp << 1) + Ch - '0') % Mod; Ch = getchar(); } tmpX = (int)(F == '-' ? -tmp : tmp); } void Read()
{ scanf(
"%d%d", &N, &M); for (int i = 0; i <= N; ++i) Fscan(arr[i]); } int T, Que[maxM]; long long Calc(const int &X)
{
long long Ans = 0; for (int i = N; i; --i) Ans = ((Ans + (long long)arr[i]) * (long long)X) % Mod; Ans = (Ans + (long long)arr[0]) % Mod; return Ans; } void Solve()
{
for (int i = 1; i <= M; ++i) if (!Calc(i)) Que[++T] = i; } int main() { Read(); Solve(); printf("%d\n", T); for (int i = 1; i <= T; ++i) printf("%d\n", Que[i]); return 0; }

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄