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\n");
				continue;
			}
			set<int>::iterator it=se[vv].upper_bound(ww-uu);
			if(se[vv].empty() || it==se[vv].begin()){
				printf("-1\n");
				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\n", ans);
		}
	}
	return 0;
}
posted @ 2018-05-17 15:29  poorpool  阅读(523)  评论(0编辑  收藏  举报