最大花费刚开始不知道样例给的60哪来的,后面想明白了是先放到最上边等这个方块掉下去。
最小的花费需要注意的是(1,1,z)(1<=z<=n)这一列没有,剩下的就是取模的问题了,这该死的取模!
用到的数学公式:
1 + 2 + 3 + …… + n = n*(n+1)/2;
12 + 22 + 32 + …… + n2 = n*(n+1)*(2n+1)/6;
完整代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
typedef __int128 ll;
const int mod = 1e9+7;
void scan(__int128 &x)//输入
{
x = 0;
int f = 1;
char ch;
if((ch = getchar()) == '-') f = -f;
else x = x*10 + ch-'0';
while((ch = getchar()) >= '0' && ch <= '9')
x = x*10 + ch-'0';
x *= f;
}
void print(__int128 x){
if(!x) return;
if(x) print(x/10);
putchar(x%10+'0');
}
void solve1(ll n){
ll ans = 1;
ans += ((n*(n+1)*(2*n+1)/6)%mod)*((n*(n+1))%mod);
ans -= (n*(n+1)*(2*n+1)/6)%mod + (n*(n+1)/2)%mod - 1;
ans += (((n*(n+1)/2)%mod)*((n*(n+1)/2)-2))%mod;
print(ans%mod);
printf("\n");
}
void solve2(ll n){
ll ans = 0;
ans = (((((n*(n+1)*(2*n+1)/6)%mod) * n*(n+1)/2)%mod)*n%mod)*n;
print(ans%mod);
printf("\n");
}
int main(){
ll t;
scan(t);
while(t--){
ll n;
scan(n);
n = n % mod;
solve1(n);
solve2(n);
}
return 0;
}