好耶,均参考了大佬题解
对于B题
链接:https://ac.nowcoder.com/acm/contest/11164/B
来源:牛客网
题目描述
一天,小 L 收到了一个多项式 f(x)=∑i=0naixif(x) = \sum_{i = 0} ^ {n} a_ix ^ if(x)=∑i=0naixi,现在他想求这个多项式的若干点值,你能帮帮他吗?
即,给定 x1...xmx_1...x_mx1...xm,需要你求 f(x1)....f(xm)f(x_1)....f(x_m)f(x1)....f(xm)。由于结果可能很大,你需要输出结果对 998244353 取模的值。
即,给定 x1...xmx_1...x_mx1...xm,需要你求 f(x1)....f(xm)f(x_1)....f(x_m)f(x1)....f(xm)。由于结果可能很大,你需要输出结果对 998244353 取模的值。
输入描述:
第一行一个正整数 n,表示多项式 f 的次数。
第二行 n + 1 个整数 a0,a1...ana_0,a_1...a_na0,a1...an,表示 f 各项的系数。
第三行一个整数 m,表示要求的点数的个数。
第四行 m 个整数 xix_ixi,意义见【题面描述】。
输出描述:
输出仅一行 m 个数,为 f(x1)...f(xm)f(x_1)...f(x_m)f(x1)...f(xm) 对 998244353 取模的结果。
示例1
说明
f(x)=x2+x+1f(x) = x ^ 2 + x + 1f(x)=x2+x+1,在 x = 2,3,4 处的点值分别为 22+2+1=7,32+3+1=13,42+4+1=212 ^ 2 + 2 + 1 = 7, 3 ^ 2 + 3 + 1 = 13, 4 ^ 2 + 4 + 1 = 2122+2+1=7,32+3+1=13,42+4+1=21。
对于 30%30\%30% 的数据,满足 n,m≤5,ai,xi≤5n, m \leq 5, a_i, x_i \leq 5n,m≤5,ai,xi≤5。
另有 30%30\%30% 的数据,满足 a0=a1=...=ana_0 = a_1 = ... = a_na0=a1=...=an。
对于 100%100\%100% 的数据,满足 1≤n,m≤1000,0≤ai,xi<9982443531 \leq n, m \leq 1000, 0 \leq a_i, x_i < 9982443531≤n,m≤1000,0≤ai,xi<998244353。
另有 30%30\%30% 的数据,满足 a0=a1=...=ana_0 = a_1 = ... = a_na0=a1=...=an。
对于 100%100\%100% 的数据,满足 1≤n,m≤1000,0≤ai,xi<9982443531 \leq n, m \leq 1000, 0 \leq a_i, x_i < 9982443531≤n,m≤1000,0≤ai,xi<998244353。
题解里对多项式的拆分值得关注,
一个 系数 1,1,1的 最高级为2次的方程,一开始在构想怎么形成这样一条方程,再把所给的点带进去,其实可以将次数从大到小扫一遍即可,
以1,1,1的例子举例,最后所得为x^2+x+1;
以x+ai为起步,每次乘以X在加上下一个ai;
首先,0*x+1;
再,1*x+1=x+1
再,(x+1)*x+1=x^2+x+1 即最后结果
在例如 系数为1,2,3
1.0*x+3 2.3*x+2=3x+2 3.(3x+2)*x+1=3x^2+2x+1
#include <iostream> const long long M=998244353; using namespace std; int a[10005]; int main(){ int n; cin>>n; for(int i=0;i<=n;i++) cin>>a[i]; int q; cin>>q; while(q--){ int x; cin>>x; long long ans=0; for(int i=n;i>+n;i--) ans=(ans*x+a[[i]])%M;// 拆开来一项一项写,其实就是每个项乘以系数每乘以一遍x就要mod M,以防溢出 cout<<ans<<" "; } return 0; }
A题
链接:https://ac.nowcoder.com/acm/contest/11164/A
来源:牛客网
来源:牛客网
题目描述
小 L 刚考完期末,他写了一篇很烂的作文,烂到老师都不愿意给它扣分,只能给他加分,已知老师比较牛,所以他发现一个字符 x 就会加一分。问你小 L 最后可以得到多少分。
输入描述:
第一行,给你一个字符 x,表示可以加分的字符。
第二行,给你一个字符串 s,表示文章。
输出描述:
一个整数,表示小 L 得了多少分。
#include <iostream>
using namespace std;
int main(){
char x;
string s;
cin>>x>>s;
int ans=0;
for(auto t:s) ans+=t==x;
cout<<ans;
return 0;
} //单纯的更简便一些