Test Message

e273: 微分入門課

內容

求一個多項式函數 f(x) 對 x 微分的結果


輸入

有多筆測資

每筆測資包含:

第一行有一個整數 n(n<=1000)

第二行有 n 個整數,代表多項式函數 f(x)之係數(按照降冪排列),且保證所有係數皆小於 50,大於 0

3
1 2 1

輸出

輸出此多項式函數對 x 微分的結果(降冪排列且輸出係數即可)

2 2


解題思路

用程式實作微分。

這題主要是優化,除了基本的 IO 優化外,乘法因為範圍不大所以先建好一個乘法表之後直接查表取值。


完整程式碼

AC (0.1s, 1.3MB)
#include <stdio.h>
#define BUFSIZ 1048576

unsigned int mTable[55][1010];
char output[50000];

inline char readChar()
{
static char buffer[BUFSIZ], * now = buffer + BUFSIZ, * end = buffer + BUFSIZ;
if (now == end)
{
if (end < buffer + BUFSIZ)
return EOF;
end = (buffer + fread(buffer, 1, BUFSIZ, stdin));
now = buffer;
}
return *now++;
}

inline char readUInt(unsigned register int* dst)
{
register char ch;
while ((ch = readChar()) < '0')
if (ch == EOF) return 0;
*dst = ch ^ '0';
while ((ch = readChar()) >= '0')
* dst = (*dst << 3) + (*dst << 1) + (ch ^ '0');
return 1;
}

inline char* setUInt(char buffer[], register unsigned int src, const char suffix)
{
register unsigned int div;
char tmp[11], * st = tmp + 10, *res = buffer - 1;
*st = 0;
do
{
*(--st) = src - ((div = src / 10) << 3) - (div << 1) + '0';
} while (src = div);
while (*++res = *st++)
;
if (suffix)* res++ = suffix;
return res;
}

int main()
{
unsigned int n, tmp;
char* oTop;
for (int i = 1; i < 50; ++i)
{
for (int j = 1; j < 1000; ++j)
mTable[i][j] = mTable[i][j - 1] + i;
}
while (readUInt(&n))
{
if (n <= 1)
{
puts("0");
if (!n) continue;
}
else
{
oTop = output;
while (--n)
{
readUInt(&tmp);
oTop = setUInt(oTop, mTable[tmp][n], ' ');
}
*(oTop - 1) = '\0';
puts(output);
}
readUInt(&tmp);
}
return 0;
}