题面:在一个n × n x n的立方体中填充1 x 1 x 1的小立方体,填充时受地心引力,若填充的小立方体下放没有距离为1的小立方体,会自动下落到最近的小立方体上,每次填充花费X × y^2 × z,要求填充后主视图,左视图,俯视图都为n x n的正方形,求最小和最大花费。
解析:首先考虑俯视图,根据要求,易知底层一定铺满。
最大花费:显然首先一定要填满,然后填的方式都是从顶层填。易知公式为图片说明
最小花费:不将立方体填满,因为y影响的花费大,不能沿对角线填充,对角线的花费相当于边界花费的乘积,而直接填立方体的边界则是花费的和,注意要将x,y交叉的部分排除。下面是除底面的花费
图片说明
另外,因为数据过大,防止爆精度,需要逆元并且先对n取模。
代码

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int mod=1e9+7;
ll t,n;
ll kpow2(ll a,ll b)
{
    if(b==0) return 1;
    if(b%2==1) return a*kpow2(a,b-1)%mod;
    else {
        ll t=kpow2(a,b/2);
        return t*t%mod;                                                                                                                                     
    }
}
int main(){
    scanf("%lld",&t);
    while(t--){
        scanf("%lld",&n);
        n%=mod; 
        ll a=(n+1)*n%mod*kpow2(2,mod-2)%mod;
        ll a2=(n-1)*(n+2)%mod*kpow2(2,mod-2)%mod;
        ll b=(a*(2*n+1))%mod*kpow2(3,mod-2)%mod;



            printf("%lld\n",(((a+b-2)%mod)*a2+a*b)%mod);


        printf("%lld\n",((((n%mod)*(n%mod))%mod)*((a*b)%mod))%mod);
    }
}