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