【题目描述】
一元多项式求导,问求导后系数;
【输入格式】
第一行输入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 }