google codejam 2008の問題記述: Round 1A Question 3
この問題では、数値 (3 + √5) nの小数点の前の最後の 3 桁を見つける必要があります。
例えばn=5の場合、(3+√5) 5 =3935.73982… 答えは935です。
n = 2 の場合、(3 + √5) 2 = 27.4164079... 答えは 027 です。
T(i) = 6*T(i-1) - 4*T(n-2) + 1 という考えに基づく私の解決策は、T(i) が n=i の整数部分である場合、次のとおりです。
#include<stdio.h>
int a[5000];
main(){
unsigned long l,n;
int i,t;
a[0]=1;
a[1]=5;
freopen("C-small-practice.in","r",stdin);
scanf("%d",&t);
for(i=2;i<5000;i++)
a[i]=(6*a[i-1]-4*a[i-2]+10001)%1000;
i=t;
for(i=1;i<=t;i++){
scanf("%ld",&n);
printf("Case #%d: %.3d\n",i,a[(int)n]);
}
fclose(stdin);
}
行a[i]=(6*a[i-1]-4*a[i-2]+10001)%1000;
で整数オーバーフローが発生することはわかっていますが、10,000を追加することで正しい答えが得られる理由はわかりません。sizeof(int)=4 の GCC コンパイラを使用しています
誰が何が起こっているのか説明できますか?