无意义运算符

题目来源:CF1110C
【简要题意】给定a,求f(a)的最大值。f(a)=max⁡0&lt;b&lt;a(gcd(a⊕b,a &amp; b))f(a)= \max\limits_{0&lt;b&lt;a}(gcd(a\oplus b,a\ \&amp;\ b))f(a)=0<b<amax(gcd(ab,a & b))

【分析】
2i&lt;=a&lt;2i+1−12^i&lt;=a&lt;2^{i+1}-12i<=a<2i+11时,ans=2i+1−1ans=2^{i+1}-1ans=2i+11
否则,答案等于a除以除了1之外的最小因数。

具体证明也是分类讨论。当2i&lt;=a&lt;2i+1−12^i&lt;=a&lt;2^{i+1}-12i<=a<2i+11时,在a所有是0位上b全为1,其余全为0。显然会有a⊕b=2i+1−1,a &amp; b=0a\oplus b=2^{i+1}-1,a\ \&amp; \ b=0ab=2i+11,a & b=0。由于b<a,所以一定不存在比它更大的数。
a=2i+1−1a=2^{i+1}-1a=2i+11有一个特殊性质a⊕b+a &amp; b=aa\oplus b+a\ \&amp;\ b=aab+a & b=a可以写成f(a)=max⁡0&lt;d&lt;=a2(gcd(a−d,d))f(a)= \max\limits_{0&lt;d&lt;=\frac{a}{2}}(gcd(a-d,d))f(a)=0<d<=2amax(gcd(ad,d))相当于把a分成几份取其中的最大公因数。

【code】
x没有每次打初始化结果只有十分。。。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
bool check(int x){
	while(x>0)
		if(x&1)x>>=1;
		else return 0;
	return 1;
}
int solve(int x){
	for(int i=2;i*i<=x;i++)
		if(x%i==0)return x/i;
	return 1;
}
int main(){
	freopen("meaning.in","r",stdin);
	freopen("meaning.out","w",stdout);
	int T,n,x;
	cin>>T;
	while(T--){
		cin>>n;
		if(check(n)) printf("%d\n",solve(n));
		else{
			while(x<n)x=(x<<1)+1;
			printf("%d\n",x);
		}
	}
	return 0;
}
### 运算符重载的概念 运算符重载是指为已有的运算符赋予额外的功能,使得这些运算符可以用于用户自定义的数据类型。当涉及到类的对象之间执行某些操作时,可以通过重载运算符来指定特定行为[^1]。 例如,在C++中,如果有一个表示复数的类`Complex`,那么就可以通过重载加号(`+`)运算符,让用户能够自然地使用两个`Complex`类型的对象相加以获得一个新的`Complex`对象的结果: ```cpp class Complex { public: double real; double imag; // 构造函数和其他成员省略... // 重载 "+" 运算符 Complex operator+(const Complex& other) const { return Complex(real + other.real, imag + other.imag); } }; ``` 这段代码展示了如何创建一个名为 `Complex` 的类并为其定义了一个新的 `operator+()` 函数版本,这允许程序员以直观的方式处理复杂数值间的加法运算[^4]。 ### 运算符重载的意义 其主要目的在于提高程序可读性和表达力的同时保持语法的一致性。通过这种方式,开发者可以让自己的数据结构看起来更接近于内建类型,并且支持常见的数学或其他逻辑上的操作[^3]。 具体来说,这意味着可以在不改变原有语义的情况下简化代码编写过程中的繁琐部分;同时也方便其他开发人员理解和维护代码库内的功能模块[^5]。 ### 应用场景 #### 数据抽象增强 对于一些复杂的业务模型或领域概念(比如矩阵、向量),可以直接利用现有的符号来进行计算而无需引入额外的方法名称,从而更好地映射到实际问题域上。 #### 提升用户体验 在设计容器类或者其他高级组件的时候,适当采用运算符重载技术能够让使用者享受到如同标准模板库(STL)所提供的便利接口一样的体验,进而提升整体框架的质量和灵活性[^2]。 #### 支持面向对象编程范式 借助于这一机制还可以实现诸如迭代器模式等功能特性,进一步促进软件系统的模块化发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值