問題はこちら
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