1 条题解
-
0
自动搬运
来自洛谷,原作者为

BqtMtsZDnlpsT
**搬运于
2025-08-24 22:18:18,当前版本为作者最后更新于2021-02-16 22:30:23,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
-
本题思路:
暴 力 出 奇 迹。-
首先设四条边长分别为 且 。
-
由初二所学内容可以发现 的取值范围为是 $ \left \lceil \frac{N}{4}\right \rceil\le a < \left \lceil \frac{N}{2}\right \rceil $(下面一些题解上好像写 ,但是仔细一想就会发现,当 为奇数时后者是错的)
-
$\because\left\{\begin{matrix}b+c+d=N-a\\b \ge c\ge d\\ b \le a\end{matrix}\right.\; \therefore \left\lceil\frac{N-a}{3}\right \rceil \le b \le a$
-
同理,得 $\left\lceil\frac{N-a-b}{2}\right \rceil \le c \le b$。
-
所以,若求出 ,就可以得到 。
-
-
所以,3重循环枚举 ,再根据 算出 。
-
由于要考虑顺序,
手动枚举可以发现:| 情况 | 种数 | | :----------: | :----------: | :----------: | | | | | 或 | | | 且 | | | 或 或 | | | | |
-
几个注意点
- 循环过程中 的值计算出来可能小于等于 ,此时可以直接退出循环(因为 的值还在变大)。
- 的值计算出来可能大于 ,不符合定义,此时不能退出循环(因为 的值变大后 会变小)。
-
代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> using namespace std; int n,s; int S(int a,int b,int c,int d)//计算情况数 { if(a==b&&a==c&&a==d)return 1; if((a==b&&a==c)||(b==c&&c==d))return 4; if(a==b&&c==d)return 6; if(a==b||b==c||c==d)return 12; return 24; } int main() { scanf("%d",&n); for(int i=(n+3)/4;i<(n+1)/2;i++)//i对应a for(int j=(n-i+2)/3;j<=i;j++)//j对应b for(int k=(n-i-j+1)/2;k<=j;k++)//k对应c { int l=n-i-j-k;//计算d if(l<=0)break; if(l>k)continue; s+=S(i,j,k,l); } printf("%d",s); } -
- 1
信息
- ID
- 5214
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者