题目描述
输入描述
输出描述
输入样例
1
2
输出样例
27
60
题目大意:给定一个 n * n * n 的三维空间及无限个 1 * 1 * 1 的小正方体,现在需要将该空间铺至其三视图(左,前,上)铺满(即 n * n),每铺一个正方体的花费是 x * y ² * z ,求满足该条件的最小花费和最大花费分别是多少。需要注意的是,方块满足物理规律,即悬空的方块将会下落。
开赛的时候想了很久也不明白最大花费的 60 是怎么得到的,手模的答案一直是 45,后来才知道最大花费是将方块都放置于最顶层,等方块自动下落后再铺下一层(同样是以放在顶层的方式)。由此即可很快推出最大花费的计算公式为 n * 铺满最顶层的花费。
对于最小花费,不难想出有两种可能:① 将底面及 XoY 对角线铺满; ② 将 XoY、YoZ、XoZ 面都铺满(特别注意原点一列仅需铺满底层一个)。虽然方法 ① 需要使用的方块数量更少,但由于花费与 y ² 有关,因此需要规避将产生更大的 y ² 系数的方法,而方法 ② 可将 YoZ 面控制为 y ² * z * 1,因此选择方法 ② 的花费将更少。
需要注意的是,由于本题数据过大需要不断取模,除法直接取模将导致答案错误,需要用到逆元。
参考代码
#include <bits/stdc++.h>
using namespace std;
int mod=1e9+7;
typedef long long ll;
ll ny(ll a,ll k,ll mod){
ll res=1;
while(k){
if(k&1) res=(ll)res*a%mod;
a=(ll)a*a%mod;
k/=2;
}
return res;
}
int main(){
ll n;
int t;
cin>>t;
while(t--){
cin>>n;
n%=mod;
ll maxn=(n%mod*n%mod*n%mod*n%mod)*(n+1)%mod*(n+1)%mod*(2*n+1)%mod*ny(12,mod-2,mod)%mod;
ll di=(n%mod*n%mod)*(n+1)%mod*(n+1)%mod*(2*n+1)%mod*ny(12,mod-2,mod)%mod;
ll a=(n-1)%mod*(n-1)%mod*(n+2)%mod*(n+2)%mod*ny(4,mod-2,mod)%mod;
ll b=(n-1)%mod*n%mod*(n+1)%mod*(n+2)%mod*(2*n+1)%mod*ny(12,mod-2,mod)%mod-(n+2)%mod*(n-1)%mod*ny(2,mod-2,mod)%mod;
cout<<(di+a+b)%mod<<endl<<maxn<<endl;
}
return 0;
}