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


,,,
i個の場合をi-1個から高速に求める処理を書いたがそういうレベルの話ではないらしい。
解けない。
下記は正しいが40個めまですごく時間がかかるコード、たぶん数日とかじゃすまない。
数式のレベルで考えないと駄目か。
数分の計算で条件を満たす25個めまでの数は得られた。

2 3
3 10
4 22
5 63
6 133
7 372
8 780
9 2173
10 4551
11 12670
12 26530
13 73851
14 154633
15 430440
16 901272
17 2508793
18 5253003
19 14622322
20 30616750
21 85225143
22 178447501
23 496728540
24 1040068260
25 2895146101

ここまでの計算で数分かかったのであきらめた。


#include<stdio.h>
#include<iostream>

int main(){
	__int64 ans=1,d=1,add=2,all=3,count=1;
	
	for(__int64 i=2;;i++){
 		all+=(i/2+i%2)+((i-1)/2+(i-1)%2)+(2*i)-(i-1);
		
		while(d<all){
			d+=add;
 			add++;
		}
		all=all-d;
		d=0;
		//std::cout<<i<<" "<<all<<"\n";
		if(d==all){
			ans+=i;
			std::cout<<i<<" "<<all<<"\n";
			count++;
		}
 		if(count==40)break;
	}
	std::cout<<"ans="<<ans;
}  
最終更新:2015年03月23日 13:49