题解:AT_pakencamp_2020_day1_d 立方体を壊せ!

· · 题解

问题分析

题目要求计算边长为 N 的立方体被平面 x+y+z=K 切割后,包含原点 (0,0,0) 的部分体积的 6 倍是多少。\ 立方体的范围为 0 \le x,y,z \le N,平面 x+y+z=K 将空间分为两部分,并且包含原点的部分满足 x+y+z \le K

核心思路

根据 K 与立方体的位置关系,平面切割立方体的效果不同,需分类讨论:

公式推导

代码实现

根据上述推导,分情况计算结果:

#include<bits/stdc++.h>
using namespace std;
long long n,k,res;
int main(){
    cin>>n>>k;
    if(k==0){
        res=0;
    }else if(k<=n){
        res=k*k*k;
    }else if(k<=2*n){
        res=3*k*k*n-3*k*n*n+n*n*n-2*(k-n)*(k-n)*(k-n);
    }else if(k<=3*n){
        res=6*n*n*n-(3*n-k)*(3*n-k)*(3*n-k);
    }else{
        res=6*n*n*n;
    }
    cout<<res<<endl;
    return 0;
}