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;
}

猜你喜欢

转载自www.cnblogs.com/poorpool/p/9051372.html