無意義運算符

題目來源:CF1110C
【簡要題意】給定a,求f(a)的最大值。f(a)=max0<b<a(gcd(ab,a & b))f(a)= \max\limits_{0<b<a}(gcd(a\oplus b,a\ \&\ b))

【分析】
2i<=a<2i+112^i<=a<2^{i+1}-1時,ans=2i+11ans=2^{i+1}-1
否則,答案等於a除以除了1之外的最小因數。

具體證明也是分類討論。當2i&lt;=a&lt;2i+112^i&lt;=a&lt;2^{i+1}-1時,在a所有是0位上b全爲1,其餘全爲0。顯然會有ab=2i+11,a &amp; b=0a\oplus b=2^{i+1}-1,a\ \&amp; \ b=0。由於b<a,所以一定不存在比它更大的數。
a=2i+11a=2^{i+1}-1有一個特殊性質ab+a &amp; b=aa\oplus b+a\ \&amp;\ b=a可以寫成f(a)=max0&lt;d&lt;=a2(gcd(ad,d))f(a)= \max\limits_{0&lt;d&lt;=\frac{a}{2}}(gcd(a-d,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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章