首页 > 其他分享 >[lnsyoj2246/luoguCF979D]Kuro and GCD and XOR and SUM

[lnsyoj2246/luoguCF979D]Kuro and GCD and XOR and SUM

时间:2024-08-09 21:29:40浏览次数:9  
标签:Kuro XOR GCD minn int tr ne Trie include

题意

给定集合 \(S\),初始为空,进行 \(q\) 次修改或查询操作:修改操作将 \(x\) 加入集合;查询操作给定 \(x,s,k\),要求找到满足

\[\max_{u\in S,u+x\le s,k|\gcd(u,x)} \{u\oplus x\} \]

的最小的 \(u\)。

sol

集合、异或、可查可改,可以自然地想到 0/1-Trie
我们假设 \(k=1\),此时不需要考虑 \(k|\gcd(u,x)\) 的条件,这就是一个有上限的最大异或和问题。我们对每个点记录一个 \(minn\),表示经过这个点的最小值,这样,当找到一个点时,如果 \(s-x>minn_u\),就不能够进入这个点。
再来考虑 \(k\),我们可以对于每一个可能的 \(k\) 值都建立一棵 Trie 树,这样,每次插入的时候,\(O(\sqrt{n})\) 地枚举所有约数代表的 Trie 树,在这些 Trie 树中都插入 \(x\)。查询的时候直接查找第 \(k\) 棵树即可。

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <unordered_set>

using namespace std;

const int N = 50000005, K = 20;

int q;
int tr[N][2], minn[N], idx;
unordered_set<int> st;

void ins(int x, int p){
    for (int c = K - 1; c >= 0; c -- ){
        int u = (x >> c) & 1;
        if (!tr[p][u]) tr[p][u] = ++ idx;
        p = tr[p][u];
        minn[p] = minn[p] ? min(minn[p], x) : x;
    }
}

int query(int x, int s, int k){
    int res = 0, p = k;
    for (int c = K - 1; c >= 0; c -- ){
        int u = ((x >> c) & 1) ^ 1;
        int ne = tr[p][u], xne = tr[p][u ^ 1];
        if (ne && minn[ne] <= s - x) res += u << c, p = ne;
        else if (xne && minn[xne] <= s - x) res += (u ^ 1) << c, p = xne;
        else return -1;
    }

    return res ? res : -1;
}

int main(){
    idx = 100000;
    scanf("%d", &q);
    while (q -- ){
        int op, x;
        scanf("%d%d", &op, &x);
        if (op == 1) {
            if (st.find(x) == st.end()){
                for (int i = 1; i * i <= x; i ++ ){
                    if (x % i) continue;
                    ins(x, i);
                    if (i * i != x) ins(x, x / i);
                }
                st.insert(x);
            }
        }
        else {
            int k, s;
            scanf("%d%d", &k, &s);
            if (x % k) puts("-1");
            else printf("%d\n", query(x, s, k));
        }
    }
    return 0;
}

标签:Kuro,XOR,GCD,minn,int,tr,ne,Trie,include
From: https://www.cnblogs.com/XiaoJuRuoUP/p/-/lnsyoj2246_luoguCF979D

相关文章

  • GCD (最大公因数)的性质
    GCD的性质总结\(gcd(a_1,a_2,......a_n)=gcd(|a_1|,|a_2|,......|a_n|)\)\(gcd(a,0)=gcd(a,a)=|a|\)\(gcd(a_1,a_2,......a_{n-1},a_n)=gcd(gcd(a_1,a_2),a_3,......a_{n-1},a_n)\)对于不全为零的整数\(a_1,a_2,a_3,......a_{n-1},a_n\),$\forall1<k<n-1\(,......
  • E - Xor Sigma Problem
    原题链接题解首先,位运算很容易想到按位枚举。而这道题的关键是如何快速求区间异或和。对此,我们构建一个后缀异或数组即可,甚至这个数组可以进一步优化为cnt1和cnt0两个变量。(具体实现看code理解)code #include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;......
  • leetcode 1486. 数组异或操作 https://leetcode.cn/problems/xor-operation-in-an-arr
    1486.数组异或操作题目描述给你两个整数,n和start。数组nums定义为:nums[i]=start+2*i(下标从0开始)且n==nums.length。请返回nums中所有元素按位异或(XOR)后得到的结果。示例示例1:输入:n=5,start=0输出:8解释:数组nums为[0,2,4,6,8],其中(0^......
  • Solution - Atcoder AGC052B Tree Edges XOR
    令\(w_{(u,v)}\)为边\((u,v)\)的边权。考虑到对于一条边进行操作影响的是有公共点的边,于是一个想法是把边权转到点权,用点权来表示边权。于是考虑对于每个点构造\(w_u\)使得\(w_{(u,v)}=w_u\oplusw_v\)。因为这是一颗树,所以一定存在合法的构造。其实到了这里,这种......
  • iOS基础---多线程:GCD、NSThread、NSOperation
    系列文章目录iOS基础—多线程:GCD、NSThread、NSOperationiOS基础—CategoryvsExtension文章目录系列文章目录一、GCD1.GCD的任务、函数、队列a.任务b.函数c.队列2.GCD的使用a.同步函数+并发队列b.异步函数+并发队列c.同步函数+串行队列d.异步函数+串行队列e.同步函......
  • P10463 Interval GCD
    P10463IntervalGCD原题传送门思路首先,有个性质:对于任意多整数,它们的最大公约数与它们的差分序列的最大公约数相同,可以通过以下证明。\(\foralla,b,c\in\mathbb{N}\text{,有}\gcd(a,b,c)=\gcd(a,b-a,c-b)\)\(\text{证明:设}d\mida,d\midb,d\midc\)......
  • 基础数论 欧拉定理与exgcd
    欧拉定理:若正整数\(a,n\)互质,则\(a^{\varphi(p)}\equiv1(\bmodp)\)推论(扩展欧拉定理):\[a^b\equiv\begin{cases}a^{b\\bmod\\varphi(p)}\\\\\\\\\\gcd(a,p)=1\\a^b\\\\\\\\\\\\\\\\\\\\\\gcd(a,p)!......
  • 快速 GCD
    预处理GCD\(O(n)\)预处理,\(O(1)\)查询两个小于\(n\)的数的快速\(\gcd\)。引理对于任意正整数\(n\),可以将\(n\)写成\(n=abc\),满足\(a,b,c\)任意一个小于\(\sqrt{n}\)或为质数。考虑归纳,首先对于\(1\),显然成立。否则,设\(n\)的最小质因子为\(p\),设\(\dfrac{n......
  • gcd之和(一维)
    gcd之和求∑i=1n......
  • 二元一次不定方程(Exgcd)(更方便的解法)
    扩展欧几里得算法(Exgcd)裴蜀定理对于任意一组整数\(a,b\),存在一组整数\(x,y\),满足\(ax+by=\gcd(a,b)\)。Proof:考虑数学归纳法。当\(b=0\)时,由于\(\gcd(a,0)=a\),则对于\(ax+0y=a\)这个不定方程,\(x=1\),\(y\)取任意整数。假设存在一组整数\(x,y\),满足$bx+(a\bmodb)y......