內容
求一個多項式函數 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;
 }
 
 |