HDU - 7018 - Banzhuan( 思维 + 数学 )

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

在这里插入图片描述

题意

三维空间 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)nz

对于 y = 2 , z = 1 , x 的代价和 = ( 1 + n ) ∗ n 2 ∗ 4 ∗ z \frac{(1+n)*n}{2}*4*z 2(1+n)n4z

对于 y = n , z = 1 , x 的代价和 = ( 1 + n ) ∗ n 2 ∗ n 2 ∗ z \frac{(1+n)*n}{2}*n^2*z 2(1+n)nn2z

因此对于 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 n2(1+n)n6n(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)n6n(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)n1)(6n(n+1)(2n+1)1+2(1+n)n1)

= ( 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+n2)(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 n2(1+n)n6n(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)n6n(n+1)(2n+1)+6(n2+n2)(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;
} 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值