Banzhuan(hdu7018)

原题链接

题目描述

在这里插入图片描述

输入描述

在这里插入图片描述

输出描述

在这里插入图片描述

输入样例

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值