[Atelier Blue アトリエブルー]Homeコンテストパソコン甲子園2004年予選>17問目

17問目(近似)

問題

y=x^2,y=0,x=600という三つの線で囲まれる領域の面積を求める。ただし、積分ではなく、次の近似を使って値を求めることとする。

一定間隔dで区切り、高さは左端のy=x^2で求めた値とする。これを、x=600まで行う。また、dは600に約数。

縦の長さがf(d)で横の長さがdの長方形の面積
+縦の長さがf(2d)で横の長さがdの長方形の面積
+縦の長さがf(3d)で横の長さがdの長方形の面積
+...
+縦の長さがf(600-d)で横の長さがdの長方形の面積

図がプロコンの所のPDFに載っています。

入力

d(整数)

出力

近似的な面積(整数)

入力例

20

出力例

68440000

解き方例

for文で回すまたは、式変形より次の式を導き出します。

e = 600/d - 1

d*d*d * e*(e + 1)*(2*e + 1)/6

ソースコード

お持ち帰り

C/C++

for文法

#include <stdio.h>

int main(){
    int i,d,s;
    scanf("%d",&d);

    s=0;

    for(i=0;i<600;i+=d){
        s+= i*i*d;
    }
    printf("%d",s);

    return 0;
}

式展開

#include <stdio.h>

int main(){
    int i,d,s,e;
    scanf("%d",&d);

    e=600/d-1;
    s = d * d * d * e*(e+1)*(2*e+1)/6;

    printf("%d",s);

    return 0;
}

その他

手動での式展開に時間がかかるようであれば、for文で十分だと思います。ただし、後々のことを考えると展開の方が時間的に有利かも。その前にintの限界が来て多倍長計算しなければいけなくなるでしょうけど。


ページの一番上へ
前のページへ 一覧に戻る 次のページへ
初版2006-5-23
[Atelier Blue アトリエブルー]Homeコンテストパソコン甲子園2004年予選>17問目