中石油第二阶段我要变强个人训练赛第十六场D题求导

题目描述

给定一个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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值