P6686 混凝土数学
哈哈哈!我爱月赛。
第一次月赛拿到分呢。
(卡掉卡掉)
题目描述
你正在看混凝土数学,这时旁边的工地开工了,你觉得看他们施工更有意思,于是你向窗外望去,注意到了一些长度不同的木棍。具体而言,你看到了 nn 条木棍编号为 1,2,3,\ldots,n1,2,3,…,n,长度为 a_1,a_2,a_3,\ldots,a_na1,a2,a3,…,an。你突发奇想:有多少拿出其中 33 条木棍的方案满足它们能构成等腰三角形呢?你不想要输出的数太大,所以最后的方案要对 998244353998244353 取模。
给出等腰三角形的要求:任意两边之和大于第三边且至少有两条边边长相等。
例如,如果木棍长度分别为 \{3,3,2,2,4,5\}{3,3,2,2,4,5},你就有 66 种方法,选取的木棍编号分别为:\{1,2,3\}{1,2,3},\{1,2,4\}{1,2,4},\{1,2,5\}{1,2,5},\{1,2,6\}{1,2,6},\{1,3,4\}{1,3,4},\{2,3,4\}{2,3,4}。
我考试时的思路:
三重for循环!!!
30分代码奉上:
#include<bits/stdc++.h>
using namespace std;
int n;
int a[10000];//因为只想骗分所以就只开了10000
int flag=0;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
for(int k=j+1;k<=n;k++)
{//单调升,去重
if((a[i]==a[j]&&a[i]+a[j]>a[k])||a[j]==a[k]) flag++;//是否组成等腰
}
}
}
cout<<flag;
return 0;
}
骗到分欢天喜地
优化方法:
这道题也不用什么算法,只要想到优化办法就很简单了。
从边来思考,一个遍重复出现过2次以上才有可能当腰。
怎么记录一个边出现的次数呢?
桶。
用一个a数组记录每个边出现的次数:
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
a[x]++;
}
在寻找时,一共有两种情况:
构成等腰三角形,构成等边三角形。
1.等腰三角形
一共有x条长度为y的边,选腰一共有x*(x-1)/2种情况(注意要除2)
那底呢?
因为三角形两辫子和大于第三边,
所以底小于2y。
把长度1-2y的边都遍历一遍,记个数即可:
for(int j=1;j<2*i;j++)
{
k=k+a[j];
}
总共有x*(x-1)*(k-x)/2种情况(注意,要去掉等边的情况)
2.等边三角形
共有x*(x-1)*(x-2)种情况
然后把两种情况加起来,就做完啦~:
#include<bits/stdc++.h>
using namespace std;
long long a[2000001];//十年OI一场空,不开long long见祖宗
int n;
int x;
int j=1;
long long ans=0;//记录总方案数
int k=0;
int maxn=0;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);//快读
a[x]++;//桶,记录边数
if(x>maxn) maxn=x;//这里用了个maxn来储存最大的边当做循环边界
}
for(int i=1;i<=maxn;i++)
{
for(;j<2*i&&j<=maxn;j++)
{
k=k+a[j];//这里是一大坑点,如果每次j都从1开始,是O(n²)的复杂度,会超时,运用记忆化的思想,在上一种下寻找新的组合,复杂度便可以降到O(n)。
}
ans=(ans+a[i]*(a[i]-1)*(k-a[i])/2+a[i]*(a[i]-1)*(a[i]-2)/6)%998244353;//这里不用分类讨论,因为不符合要求(小于3)会有一个乘数为0,不影响结果
}
printf("%lld",ans%998244353);//记得取余
return 0;
}
还有一些细节已在代码中说明,maxn和记忆化不考虑可是会爆零的(别问我是怎么知道的)
陈老看完留个言吧!!
P6686 混凝土数学的更多相关文章
- [BUAA_SE_2017]个人作业-Week1
个人作业-Week1 疑问 教材中说,PM在衡量需求时需要方方面面的能力与研究.可是,当下许多互联网IT公司只承担外包业务,即客户给什么需求就实现什么需求,甚至可能不要求其它先进的功能.此时,开发团队 ...
- [日常] NOIWC2019 冬眠记
NOIWC 2019 冬眠记 辣鸡rvalue天天写意识流流水账 Day 0 早上没有跑操(极度舒服.png) 和春哥在博客颓图的时候突然被来送笔电的老爹查水表(捂脸) 母上大人骗我说这功能机不能放存 ...
- 数学思想:为何我们把 x²读作x平方
要弄清楚这个问题,我们得先认识一个人.古希腊大数学家 欧多克索斯,其在整个古代仅次于阿基米德,是一位天文学家.医生.几何学家.立法家和地理学家. 为何我们把 x²读作x平方呢? 古希腊时代,越来越多的 ...
- 速算1/Sqrt(x)背后的数学原理
概述 平方根倒数速算法,是用于快速计算1/Sqrt(x)的值的一种算法,在这里x需取符合IEEE 754标准格式的32位正浮点数.让我们先来看这段代码: float Q_rsqrt( float nu ...
- MarkDown+LaTex 数学内容编辑样例收集
$\color{green}{MarkDown+LaTex 数学内容编辑样例收集}$ 1.大小标题的居中,大小,颜色 [例1] $\color{Blue}{一元二次方程根的分布}$ $\color{R ...
- 深度学习笔记——PCA原理与数学推倒详解
PCA目的:这里举个例子,如果假设我有m个点,{x(1),...,x(m)},那么我要将它们存在我的内存中,或者要对着m个点进行一次机器学习,但是这m个点的维度太大了,如果要进行机器学习的话参数太多, ...
- Sql Server函数全解<二>数学函数
阅读目录 1.绝对值函数ABS(x)和返回圆周率的函数PI() 2.平方根函数SQRT(x) 3.获取随机函数的函数RAND()和RAND(x) 4.四舍五入函数ROUND(x,y) 5.符号函数SI ...
- *HDU 2451 数学
Simple Addition Expression Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- 如何解决Maple的应用在数学中
对任意数学和技术学科的研究员.教师和学生而言,Maple是一个必备的工具.通过Maple,教师将复杂数学问题注入生命,学生的精力集中在概念理解上而不是如何使用工具上,研究员可以开发更复杂的算法或模型. ...
随机推荐
- 多年经验总结,写出最惊艳的 Markdown 高级用法
点赞再看,养成习惯,微信搜索[高级前端进阶]关注我. 本文 GitHub https://github.com/yygmind 已收录,有一线大厂面试完整考点和系列文章,欢迎 Star. 最近在学习的 ...
- PHP 插件资源
PHP jsonRPC 百度云网盘地址 https://pan.baidu.com/s/1itCIhrdd5bPGJMefNUuKvw 提取码 : ax4d PHP Excel 百度云网盘 ...
- 【Git】命令行操作
Git 命令行操作 1 本地库初始化 git init:初始化本地仓库 效果 注意:.git目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改. 2 设置签名 形式: 用户名:tom E ...
- LeetCode116 每个节点的右向指针
给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } 填充它的每个 ...
- 【C++】《Effective C++》第六章
第六章 继承与面向对象设计 条款32:确定你的public继承塑模出is-a关系 public隐含的寓意:每个派生类对象同时也是一个基类对象,反之不成立.只不过基类比派生类表现出更一般化的概念,派生类 ...
- js的函数-function
function函数 function的英文是[功能],[数] 函数:职责:盛大的集会的意思 在js里,就是函数的意思.在Java里叫做方法. 定义函数 function fun(参数){ //函数体 ...
- 那些最全面的Windows10安装pytorch踩过的坑以及如何应用
那些最全面的Windows10安装pytorch踩过的坑以及如何应用 一.pytorch简介 2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch.它是一个基 ...
- iTerm2 实现 ssh 自动登录,并使用 Zmodem 实现快速传输文件
原文链接:https://fuckcloudnative.io/posts/iterm2-auto-login/ 对于 YAML 工程师来说,我们经常需要 ssh 登录不同的服务器,每次登录时都要经历 ...
- Linux Shell 编程基础详解——吐血整理,墙裂推荐!
第一部分:Linux Shell 简介 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序, ...
- 工作记录:记一次线上ZK掉线问题排查
目录 问题的发现 zk的情况以及分析 总结 问题的发现 最早问题的发现在于用户提的,用户提出他支付时支付失败,过了一会儿再试就好了,于是翻日志,查询到当时duboo调用出现了下类错误: [TraceI ...