cf979d Kuro and GCD and XOR and SUM

set做法
正解是trie……

主要是要学会 (a mathrm{xor} b leq a+b) 这种操作

#include <iostream>
#include <cstdio>
#include <set>
using namespace std;
int q, opt, uu, vv, ww;
set<int> se[100005];
int main(){
	cin>>q;
	while(q--){
		scanf("%d", &opt);
		if(opt==1){
			scanf("%d", &uu);
			for(int i=1; i*i<=uu; i++)
				if(uu%i==0){
					se[i].insert(uu);
					se[uu/i].insert(uu);
				}
		}
		else{
			scanf("%d %d %d", &uu, &vv, &ww);
			//x, k, s
			if(uu%vv){
				printf("-1
");
				continue;
			}
			set<int>::iterator it=se[vv].upper_bound(ww-uu);
			if(se[vv].empty() || it==se[vv].begin()){
				printf("-1
");
				continue;
			}
			it--;
			int sum=-1, ans=-1;
			for(; it!=se[vv].begin(); it--){
				if(sum>(*it)+uu)	break;
				if(sum<((*it)^uu)){
					sum = (*it) ^ uu;
					ans = *it;
				}
			}
			if(sum<((*it)^uu)){
				sum = (*it) ^ uu;
				ans = *it;
			}
			printf("%d
", ans);
		}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/poorpool/p/9051372.html