一些常数优化

本文探讨了在不开启O2优化的情况下,如何通过手动实现库函数及运用位运算等技巧来减少程序运行的常数开销。特别介绍了在NOIP等竞赛环境中可能遇到的问题及解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://blog.youkuaiyun.com/qq_33583069/article/details/53086992

如果编译器没有开O2优化
用库函数常数会凭空增加很多。。
似乎NOIP考场不开O2
某些时候,如果你优化到无法再优化的时候
尝试去自己重新实现库函数。

比如

  • isdigit()
  • max()/min()
  • unique()/lower_bound()/upper_bound()
  • scanf()/printf()
  • cin/cout
  • getchar()/putchar()
  • STL::queue/stack/priority_queue/deque

常数优化:

位运算

没有O2的时候(有O2不用管。编译器会帮你)
x*10 <=> (x<<3)+(x<<1)
x!=y <=> x^y
x!=-1 <=> ~x
x*2 <=> x<<1
x*2+1 <=> x<<1|1
x/2 <=> x>>1
(x+1)%2 <=> x^1
x%2 <=> x&1
x%2==0 <=> ~(x&1)

语法

inline 在非递归函数前加修饰。
循环变量 int i =>register int i

c++没有尾递归优化。所以可以自己手写栈来优化递归。

原则上尽量减少乘/除/取模 指令
取模指令如果是逐渐累加的话,

x+=add;x%=mod;
=> x+=add;x>=mod?x%=mod:1;

A?B:C 好像要比if,else语句快。

memset初始化细节 memset(a,0x3f,sizeof(a));
最后的a[1] = 0x3f3f3f3f
int的极限是 0x7fffffff
还可以~0u
INF有的时候不要刚好赋值到0X7FFFFFFF,如果有2个inf的值相加就会溢出。

乘法溢出。
这个要注意。不要直接全部long long这样慢很多

关于类型转换,一般不用管,编译器会处理。
但是,考试环境有点老?没试过,所以如果有不同类型的话最好在前面显示的强转一下。

赋值>int的话请在数字后加LL


### 晶格常数优化的重要性 在材料科学研究中,晶格常数的精确计算对于理解材料结构及其性能至关重要。由于传统实验手段存在诸多局限性[^1],理论计算方法逐渐成为研究者们关注的重点。 ### 基于密度泛函理论的第一性原理计算 目前最常用的方法之一是基于密度泛函理论(DFT)的第一性原理计算来实现晶格参数的优化。这种方法通过求解Kohn-Sham方程获得体系基态能量随体积变化的关系曲线,在此基础上找到使总能最小化的点即对应最优晶格参量[^2]。 具体操作流程如下: #### 构建模型并设置初始条件 ```bash # 使用VASP软件包作为例子 $ vasp_std > out.vasp & ``` #### 调整输入文件中的`ISIF`标签控制应力张量更新方式 ```xml <incar> ... ISIF = 3 ! 同时调整离子位置和单元胞形状/大小 ... </incar> ``` #### 执行几何结构调整直至收敛 当达到预设精度要求后停止迭代过程,此时输出的结果就包含了经过充分弛豫后的晶体结构信息以及相应的晶格参数值。 ### 应力应变分析法 另一种常见的途径是从力学角度出发考虑固体内部各原子间相互作用力平衡状态下的形变量分布情况来进行估算。该策略通常适用于已知某些特定条件下物质宏观响应特性的场合下反推微观尺度上的特征尺寸。 例如,在给定温度范围内测量样品长度改变率ΔL/L0与外加压强p之间的关系,并据此拟合得到弹性模量E和其他热物性系数;再借助这些数据构建有限元仿真模型模拟不同加载模式下试件变形趋势从而间接获取目标属性。 ### 遗传算法辅助全局搜索技术 针对复杂多维空间内的极值探寻难题,还可以引入进化类启发式寻优机制——遗传算法(GA),它模仿自然界生物种群演化规律随机生成初代个体集合并通过交叉变异重组等方式不断繁衍后代直到最终定位到全局最优解附近区域为止。 此过程中需定义适应度函数用于评估每一个候选方案的好坏程度以便筛选保留优质基因片段传递下去形成新一代群体继续探索未知领域直至满足终止准则结束循环运算返回最佳结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值