# Greedy# Input/Output Optimization

e273 - 微分入門課

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算多項式函數 f(x) 的導數。輸入包含多組測試案例,每組案例首先給定多項式的項數 n,然後給定 n 個整數,表示多項式的係數,按照降冪排列。輸出導數的係數,同樣按照降冪排列。

解題思路

題目要求計算多項式的導數,其核心思想是將每一項的係數乘以項的次數,然後將次數減 1。由於輸入的係數是按照降冪排列的,因此導數的係數也應該按照降冪排列輸出。

程式碼中,read() 函數用於快速讀取整數,write() 函數用於快速輸出整數。主函數中,首先讀取項數 n,然後迴圈讀取每個係數,並計算導數的係數。由於導數的常數項為 0,因此不需要輸出。

程式碼使用了 getchar_unlocked()putchar_unlocked() 來優化輸入輸出,避免了緩衝區的影響,提高了程式的執行效率。

複雜度分析

  • 時間複雜度: O(n)
  • 空間複雜度: O(1)

程式碼

#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include <stdio.h>
inline int read(){
	int a(0);
	char c('0');
	while(c>='0'){
		a=(a<<3)+(a<<1)+c-'0';
		c=getchar_unlocked();
	}
	return a;
}
inline void write(int x) {
	int stk[5],*ptr(&stk[0]);
	while(x){*ptr=x%10;x/=10;++ptr;}
	while(--ptr>=(&stk[0])){putchar_unlocked(*ptr+'0');}
	putchar_unlocked(32);
}
int main(){
	int a(read());
	do{
		if(!(--a))
			putchar_unlocked(48);
		else
			for(;a;--a)
				write(read()*a);	
		putchar_unlocked(10);
		read();
	}while(a=read());
}

Discussion