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)を挙げたが、結果は出なかった.
次のコードの方法に変えればいいです.
不完全な帰納+二次回帰を乱用し、最後にこのような奇妙な公式を発表した.
\[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 }