Project Euler 126 - Cuboid layers

4341 ワード

この問題はまず数式を押します...
不完全な帰納+二次回帰を乱用し、最後にこのような奇妙な公式を発表した.
\[f(t,x,y,z)=4(t-1)(x+y+z+t-2)+2(xy+yz+xz)\]
縦横縦横が(x)、(y)、(z)の立方体の(t)番目のレイヤに配置される立方体の個数を表します.
次は答えだ...
方法は簡単です:暴力
しかし、暴力にはテクニックがあり、最初は1から1000枚まで(t)、(x)、(y)、(z)を挙げたが、結果は出なかった.
次のコードの方法に変えればいいです.
 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 #include <algorithm>

 5 using namespace std;

 6 const int maxn=200000;

 7 int a[210000];

 8 inline int f(int t,int x,int y,int z)

 9 {

10     return 4*(t-1)*(x+y+z+t-2)+2*(x*y+y*z+x*z);

11 }

12 int main(int argc, char *argv[])

13 {

14     freopen("1.out","w",stdout);

15     for(int x=1;f(1,x,x,x)<=maxn;x++)

16         for(int y=x;f(1,x,y,y)<=maxn;y++)

17             for(int z=y;f(1,x,y,z)<=maxn;z++)

18                 for(int t=1;f(t,x,y,z)<=maxn;t++)

19                 a[f(t,x,y,z)]++;

20     for(int i=1;i<=200000;i++)

21         printf("%d %d
",i,a[i]); 22 return 0; 23 }