2021“MINIEYE杯”中国大学生算法设计超级联赛(5)HDU7018 Banzhuan(阅读理解)
Banzhuan
*Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 102 Accepted Submission(s): 36
*
Problem Description
Given a three-dimensional space of [1,n]×[1,n]×[1,n]. You're required to place some 1×1×1 cubes to make this 3D space look n×n square from above, from left and from front, while the plane xOy stand for the ground and z axis describes the height.
But placing these cubes must follow some restrictions. Obviously, it must obey the gravity laws. It means, when beneath a cube is empty, the height of this cube will drop one, until its height is exactly 1 (touch the ground) or there is another cube below it.
And besides that, placing cubes has some prices. If a cube is placed at an integer coordinate (x,y,z), the price will be x×y2×z.
Now, satisfying all the requirements above, you're required to calculate the minimum costs and the maximum costs.
Input
The first line contains an integer T(T≤15). Then T test cases follow.
For each test case, input a single integer n per line, while satisfying 1≤n≤1018.
Output
For each test case, output two lines. For the first line output the minimum costs mod 109+7. And for the second line, output the maximum costs mod 109+7.
Sample Input
1
2
Sample Output
27
60
Source
2021“MINIEYE杯”中国大学生算法设计超级联赛(5)
题意极其坑逼...这个题实际上说你可以在一个\(n\times n \times n\)的空间放\(1\times 1\times 1\)的小立方体,放置的花费是\(xy^2z\),注意这个花费是放置位置处的花费,比如在(1, 1, 3)的位置放那么花费就是3,但是放完后这个小立方体会掉下去。问防止完后能使整个几何体的三视图都是\(n\times n \times n\)正方形的最大花费和最小花费。
最大花费就是在z = n的这一层不断往下扔小立方体直到填满为止。最小花费为先填满最底层,然后在XOY平面的(2, 1), (3, 1)...(n, 1)以及(1, 2), (1, 3)...(1, n)这些位置不断往上放。最终的答案就是\(max = n^2\frac{n(n+1)}{2}\frac{n(n+1)(2n+1)}{6},\ min = \frac{n^2(n+1)^2(2n+1))}{12}+\frac{(n-1)^2(n+2)^2}{4}+(\frac{n(n+1)(2n+1)}{6}-1)\frac{(n+2)(n-1)}{2}\)
注意涉及到除法,比赛的时候因为取模wa了无数次于是怒而写了发java的大数QwQ
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
for(int i = 0; i < t; i++) {
BigInteger n = sc.nextBigInteger();
BigInteger nn = n.add(n);
BigInteger mn = BigInteger.ZERO, mx = BigInteger.ZERO;
BigInteger six = new BigInteger("6");
BigInteger two = new BigInteger("2");
BigInteger md = new BigInteger("1000000007");
mx = n.pow(4);
mx = mx.multiply(n.add(BigInteger.ONE));
mx = mx.multiply(n.add(BigInteger.ONE));
mx = mx.multiply(nn.add(BigInteger.ONE));
mx = mx.divide(six);
mx = mx.divide(two);
mx = mx.mod(md);
//System.out.println(mx);
BigInteger p1 = BigInteger.ZERO, p2 = BigInteger.ZERO, p3 = BigInteger.ZERO;
p1 = n.pow(2);
p1 = p1.multiply(n.add(BigInteger.ONE));
p1 = p1.multiply(n.add(BigInteger.ONE));
p1 = p1.multiply(nn.add(BigInteger.ONE));
p1 = p1.divide(six);
p1 = p1.divide(two);
p2 = n.add(two);
p2 = p2.multiply(n.add(two));
p2 = p2.multiply(n.subtract(BigInteger.ONE));
p2 = p2.multiply(n.subtract(BigInteger.ONE));
p2 = p2.divide(two);
p2 = p2.divide(two);
p3 = n.multiply(n.add(BigInteger.ONE));
p3 = p3.multiply(nn.add(BigInteger.ONE));
p3 = p3.divide(six);
p3 = p3.subtract(BigInteger.ONE);
p3 = p3.multiply(n.add(two));
p3 = p3.multiply(n.subtract(BigInteger.ONE));
p3 = p3.divide(two);
mn = p1.add(p2.add(p3));
mn = mn.mod(md);
System.out.println(mn);
System.out.println(mx);
}
}
}