题目链接:点击进入
题目

题意
三维空间 n * n * n 内放方块,保证前面看是 n * n ,左面看是 n * n ,上面看是 n * n 。放置一块方块的代价是x * ( y ^ 2 ) * z,求最大代价跟最小代价。
思路
最大代价就是全填满嘛,不过这个放置的时候有技巧,就是可以在高的地方放,然后让方块掉下去,越高放置代价越大,所以我们只要让所有方块都是从 z = n 的地方放下去就可以了,代价计算 :
对于 y = 1 , z = 1 , x 的代价和 =
(
1
+
n
)
∗
n
2
∗
z
\frac{(1+n)*n}{2}*z
2(1+n)∗n∗z
对于 y = 2 , z = 1 , x 的代价和 =
(
1
+
n
)
∗
n
2
∗
4
∗
z
\frac{(1+n)*n}{2}*4*z
2(1+n)∗n∗4∗z
…
对于 y = n , z = 1 , x 的代价和 =
(
1
+
n
)
∗
n
2
∗
n
2
∗
z
\frac{(1+n)*n}{2}*n^2*z
2(1+n)∗n∗n2∗z
因此对于 z = n 时一层的代价为: ( 1 + n ) ∗ n 2 ∗ ( ∑ i = 1 n i 2 ) ∗ n \frac{(1+n)*n}{2}*(\sum_{i=1}^{n}i^2)*n 2(1+n)∗n∗(∑i=1ni2)∗n
而 ∑ i = 1 n i 2 = n ∗ ( n + 1 ) ∗ ( 2 n + 1 ) 6 \sum_{i=1}^{n}i^2=\frac{n*(n+1)*(2n+1)}{6} ∑i=1ni2=6n∗(n+1)∗(2n+1)
因此 n 层的代价为: n ∗ ( 1 + n ) ∗ n 2 ∗ n ∗ ( n + 1 ) ∗ ( 2 n + 1 ) 6 ∗ n n*\frac{(1+n)*n}{2}*\frac{n*(n+1)*(2n+1)}{6}*n n∗2(1+n)∗n∗6n∗(n+1)∗(2n+1)∗n
对于最小代价,等于第一层的代价加上额外的竖立部分的代价:

第一层的代价: ( 1 + n ) ∗ n 2 ∗ n ∗ ( n + 1 ) ∗ ( 2 n + 1 ) 6 \frac{(1+n)*n}{2}*\frac{n*(n+1)*(2n+1)}{6} 2(1+n)∗n∗6n∗(n+1)∗(2n+1)
竖立部分的代价: ∑ z = 2 n ( z ∗ ( ∑ y = 2 n y 2 + ∑ x = 2 n x ) ) \sum_{z=2}^n(z*(\sum_{y=2}^{n}y^2+\sum_{x=2}^{n}x)) ∑z=2n(z∗(∑y=2ny2+∑x=2nx))
= ( ( 1 + n ) ∗ n 2 − 1 ) ∗ ( n ∗ ( n + 1 ) ∗ ( 2 n + 1 ) 6 − 1 + ( 1 + n ) ∗ n 2 − 1 ) (\frac{(1+n)*n}{2}-1)*(\frac{n*(n+1)*(2n+1)}{6}-1+\frac{(1+n)*n}{2}-1) (2(1+n)∗n−1)∗(6n∗(n+1)∗(2n+1)−1+2(1+n)∗n−1)
= ( n 2 + n − 2 ) ∗ ( n ∗ ( n + 1 ) ∗ ( n + 2 ) − 6 ) 6 \frac{(n^2+n-2)*(n*(n+1)*(n+2)-6)}{6} 6(n2+n−2)∗(n∗(n+1)∗(n+2)−6)
总结
最大代价: n ∗ ( 1 + n ) ∗ n 2 ∗ n ∗ ( n + 1 ) ∗ ( 2 n + 1 ) 6 ∗ n n*\frac{(1+n)*n}{2}*\frac{n*(n+1)*(2n+1)}{6}*n n∗2(1+n)∗n∗6n∗(n+1)∗(2n+1)∗n
最小代价: ( 1 + n ) ∗ n 2 ∗ n ∗ ( n + 1 ) ∗ ( 2 n + 1 ) 6 + ( n 2 + n − 2 ) ∗ ( n ∗ ( n + 1 ) ∗ ( n + 2 ) − 6 ) 6 \frac{(1+n)*n}{2}*\frac{n*(n+1)*(2n+1)}{6}+\frac{(n^2+n-2)*(n*(n+1)*(n+2)-6)}{6} 2(1+n)∗n∗6n∗(n+1)∗(2n+1)+6(n2+n−2)∗(n∗(n+1)∗(n+2)−6)
代码
//#pragma GCC optimize(3)//O3
//#pragma GCC optimize(2)//O2
#include<iostream>
#include<string>
#include<map>
#include<set>
//#include<unordered_map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<stack>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<fstream>
#define X first
#define Y second
#define best 131
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define lowbit(x) x & -x
#define inf 0x3f3f3f3f
#define int long long
//#define double long double
//#define rep(i,x,y) for(register int i = x; i <= y;++i)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const double pai=acos(-1.0);
const int maxn=1e6+10;
const int mod=1e9+7;
const double eps=1e-9;
const int N=5e3+10;
/*--------------------------------------------*/
inline int read()
{
int k = 0, f = 1 ;
char c = getchar() ;
while(!isdigit(c)){if(c == '-') f = -1 ;c = getchar() ;}
while(isdigit(c)) k = (k << 1) + (k << 3) + c - 48 ,c = getchar() ;
return k * f ;
}
/*--------------------------------------------*/
int t,n;
int qpow(int a,int b)
{
int res=1;
while(b)
{
if(b&1) res=res*a%mod;
b=b>>1;
a=a*a%mod;
}
return res;
}
signed main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);cout.tie(0);
cin>>t;
while(t--)
{
cin>>n;n=n%mod;
int minn,maxx,p1,p2;
// p1=(1+n)*n*n*(n+1)*(2*n+1)/12;第一层
p1=qpow(1+n,2)%mod*qpow(n,2)%mod*(2*n%mod+1)%mod*qpow(12,mod-2)%mod;
//p2=(n*n+n-2)*(n*(n+1)*(n+2)-6)/6竖着部分的代价
p2=(n*n%mod+n-2)%mod*(n*(n+1)%mod*(n+2)%mod-6)%mod*qpow(6,mod-2)%mod;
// maxx=n*(1+n)*n*n*(n+1)*(2*n+1)*n/12;//填满的最大代价
maxx=qpow(n,4)%mod*qpow(n+1,2)%mod*(2*n%mod+1)%mod*qpow(12,mod-2)%mod;
minn=(p1+p2+mod)%mod;
cout<<minn<<endl;
cout<<maxx<<endl;
}
return 0;
}

本文探讨了在三维空间中放置方块的问题,目标是最小化和最大化放置方块的总代价。通过数学推导给出了最大代价和最小代价的具体计算公式,并提供了相应的代码实现。
417

被折叠的 条评论
为什么被折叠?



