メモ

yukicoderでゆるふわgolf

yukicoder No.347 微分と積分

問題はこちら
No.347 微分と積分 - yukicoder

微分積分の計算の仕方さえ知っていればただの計算問題
一般に、実定数rに対して
x^rをxで微分するとr*x^(r-1)
xで積分すると、rが-1でないときx^(r+1)/(r+1)+C、rが-1のときlog(x)+Cとなる
(Cは積分定数対数は自然対数

「値の絶対値が大きすぎたり,小さすぎたりしないよう~」とあるし、誤差もゆるいので、細かいことを気にせずそのまま計算して大丈夫

int main(){
	int n,b;
	double a,in=0,di=0;
	scanf("%d%d",&n,&b);
	while(n--){
		scanf("%lf",&a);
		di+=a*pow(b,a-1);
		if(a==-1)in+=log(b);
		else in+=pow(b,a+1)/(a+1);
	}
	printf("%f\n%f",di,in);
	return 0;
}

要求誤差がゆるいのでfloatでも大丈夫

float a,t,s;
b;
main(){
	for(scanf("%*d%d",&b);~scanf("%f",&a);t+=(a+=1)?pow(b,a)/a:log(b))s+=a*pow(b,a-1);
	b=!printf("%f\n%f",s,t);
}

読み飛ばしを工夫して

float a,t,s;
b;
main(i){
	for(;~scanf("%f",&a);i--<0?s+=a*pow(b,a-1),t+=(a+=1)?pow(b,a)/a:log(b):(b=a));
	b=!printf("%f\n%f",s,t);
}

125B

16/07/22追記
浮動小数点型にもa++みたいな書き方していいって知らなかった…

float a,t,s;
b;
main(i){
	for(;~scanf("%f",&a);i--<0?s+=a*pow(b,a-1),t+=++a?pow(b,a)/a:log(b):(b=a));
	b=!printf("%f\n%f",s,t);
}

122B