题目描述
给定一个n次多项式 ,求它在anxn+an-1xn-1+…+a0,求它在x=x0处的导函数。
输入
有多组测试数据。每组测试数据第一行一个正整数T。
接下来3n行,对于每组数据,
第一行一个正整数n,表示多项式的次数;
第二行n+1个整数,表示这个多项式。第i个整数表示ai。
第三行一个整数x0,表示你需要求当x=x0时,该多项式的导函数。
输出
输出共T行。
对于每组数据,输出一行一个整数,表示x=x0时,该多项式的导函数对998244353取模的结果。保证答案是有理数。
若答案取模后<0,请输出答案加998244353后的结果。
样例输入
1
3
1 2 3 4
5
样例输出
332
引入:
秦九韶算法
这篇博客介绍比较好
核心代码:
for(int i=n;i>=1;i--)
sum=(i*s[i])%mod+(x*(sum%mod))%mod;
用秦九韶求多项式的导函数的和。因常数求导为0,故不计算常数求导后的结果,故n>=1。幂函数求导后会降幂,故每一项的系数变为s[i]*i。取模,防止数据溢出。
上面的多项式可写成:
题目解读:多组输入。计算多项式的导函数的和。用秦九韶算多项式导函数的和,为了防止数据溢出,在必要的时候取模。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll s[100000+10];
const int mod=998244353;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll n,i,x,sum=0;
scanf("%lld",&n);
for(i=0;i<=n;i++)
scanf("%lld",&s[i]);
scanf("%lld",&x);
for(int i=n;i>=1;i--)
sum=(i*s[i])%mod+(x*(sum%mod))%mod;
if(sum>=0)
cout<<sum<<endl;
else
cout<<sum+mod<<endl;
}
return 0;
}