1 条题解
-
0
题意
给定多项式 和 ,求 除以 的结果 。
分析
先考虑用 和 表示 ,多项式乘法的朴素方法是把两式的每一位都乘起来,最后相加。
具体形式为
$$\begin{array}{c} c_{n+m}=a_{n}b_{m}\\ c_{n+m-1}=a_{n}b_{m-1}+a_{n-1}b_{m}\\ c_{n+m-2}=a_{n}b_{m-2}+a_{n-1}b_{m-1}+a_{n-2}b_{m}\\ \vdots\\ c_{0}=a_{0}b_{0} \end{array}$$这串式子看起来没什么用,但仔细观察可以发现,其中 和 都是已知的,而后一个式子只比前一个多了一个未知数 。如果我们知道 的值,就可以求出 。
带入式子,直接递推即可。事实上因为求的是 ,只需要循环到 。
时间复杂度大概是 ,可过。
Code
#include<bits/stdc++.h> typedef long long ll; using namespace std; #define dbg(x) cout<<#x<<": "<<x<<"\n" inline ll read(){ll x=0,f=1;char c=getchar();while(c<48||c>57){if(c==45)f=0;c=getchar();}while(c>47&&c<58)x=(x<<3)+(x<<1)+(c^48),c=getchar();return f?x:-x;} const ll mod=1e9+7,maxn=4e5+5,maxt=505; ll n,m,a[maxn],b[maxn],c[maxn]; inline void solve(){ n=read(),m=read(); for(ll i=0;i<=n;++i)a[i]=read(); for(ll i=0;i<=n+m;++i)c[i]=read(); for(ll i=n+m;i>=n;--i){ ll sum=0; for(ll j=n-1;i-j<=m;--j){ sum+=a[j]*b[i-j]; } b[i-n]=(c[i]-sum)/a[n]; } for(ll i=0;i<=m;++i)printf("%lld ",b[i]); } signed main(){ ll t=1; while(t--){ solve(); } return 0; }
- 1
信息
- ID
- 12434
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 9
- 标签
- 递交数
- 15
- 已通过
- 4
- 上传者