排位赛(三)| K题

【题目描述】

  一元多项式求导,问求导后系数;

【输入格式】

  第一行输入n 、k(1 <= n, k <= 100),表示多项式次数和求导次数;

  第二行输入 n+1 个非负数,空格间隔,分别表示 n、n - 1、n - 2、...、0次项系数(系数范围0 - 100);

【输出格式】

  输出一行(n + 1)个数,先输出所有的0,再一次输出n - k、n - k - 1、...、0次项的系数;

  由于系数可能很大,请对每个系数取模 998244353 后输出;

【解题思路】

  (1)要弄清题目含义,明确输入输出顺序及含义,不要乱存;

  (2)解题的时候固执的将各项系数同数组下标绑定在一起,虽然二者有联系,但捆绑限制思路,并不好操作;

  (3)题目已经暗示数据会很大,那就要无所不用其极地减小可能的错误(具体方法如下);

【错误代码】

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 typedef long long ll;
 6 
 7 const int N = 110; 
 8 
 9 ll a[N];
10 ll an[N];
11 
12 int main()
13 {
14     int n, k;
15     scanf("%d%d", &n, &k);
16     
17     for(int i = n; i >= 0; i --) scanf("%lld", &a[i]);
18     
19     for (int i = 0; i <= n - k; i ++)
20     {
21         ll x = 1;
22         for (int j = 0; j < k; j ++) x *= (n - i - j);       
23         an[i] = a[n - i] * x;
24     }
25 
26     for (int i = 0; i < k; i ++) printf("0 ");
27     for (int i = 0; i <= n - k; i ++) printf("%lld ", an[i] % 998244353);
28     
29     return 0;
30 }

【正确代码】

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 typedef long long ll;
 6 
 7 const int N = 110; 
 8 
 9 ll a[N];
10 ll an[N];
11 
12 int main()
13 {
14     int n, k;
15     scanf("%d%d", &n, &k);
16     
17     for(int i = n; i >= 0; i --) scanf("%lld", &a[i]);
18     
19     for (int i = 0; i <= n - k; i ++)
20     {
21         ll x = 1;
22         for (int j = 0; j < k; j ++) x = x * (ll)(n - i - j) % 998244353;    //改进点【1】
23         an[i] = a[n - i] * x % 998244353;                                    //改进点【2】
24     }
25 
26     for (int i = 0; i < k; i ++) printf("0 ");
27     for (int i = 0; i <= n - k; i ++) printf("%lld ", an[i] % 998244353);
28     
29     return 0;
30 }

 

排位赛(三)| K题

上一篇:flutter 合并单元格


下一篇:elementui——表格的相同内容单元格合并