プロジェクトオイラー問225

http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%20225
数列 1, 1, 1, 3, 5, 9, 17, 31, 57, 105, 193, 355, 653, 1201 ...は, T1=T2=T3=1およびTn=Tn-1+Tn-2+Tn-3によって定義される.

27はこの数列の任意の項を割り切らないことが証明できる. 27はこの性質を持つ最初の奇数である.

この数列の任意の項を割り切らない124番目の奇数を求めよ.



とりあえずどの程度のものか調べてみようと思い何も考えない全探索で数秒の計算で答えが出ました。
こんな解法でいいのかな。
もっと数学テクニックを駆使する解法でないといけないような気もする。


#include<stdio.h>
#include<set>

struct E{
	int a,b,c;
	bool operator<(const E& e1)const{
		if(a!=e1.a)return a<e1.a;
		if(b!=e1.b)return b<e1.b;
		return c<e1.c;
	}
};

int main(){
	int c=0,ans;
	for(int i=27;;i+=2){
		std::set<E> sets;
		E e1;
		e1.a=1;
		e1.b=1;
		e1.c=1;
		sets.insert(e1);
		while(1){
			E e2;
			e2.a=(e1.a+e1.b+e1.c)%i;
			e2.b=e1.a%i;
			e2.c=e1.b%i;
			if(e2.a==0){
				break;
			}
			if(sets.find(e2)!=sets.end()){
				//printf("%d\n",i);
				c++;
				break;
			}
			sets.insert(e2);
			e1=e2;
		}
		if(c==124){
			ans=i;
			break;
		}
	}
	printf("ans=%d\n",ans);
}
最終更新:2015年12月16日 13:12