zoukankan      html  css  js  c++  java
  • qbxt Day3 on 2019-8-18

    qbxt Day3 on 2019-8-18

    一、基础数论

    1.进制转换

    进制转换是一个非常简单且基础的问题。

    也许我们只需要...Emmm...

    列个式子就好了鸭

    (k)进制数每一位上是(a_i),那么((x)_k=sumlimits_{i=1}^{ exttt{位数}}a_i*k^{i-1})

    这是任意进制下数字的转换

    和进制的转换有关的题目大多数围绕这个式子有关。
    (NOIp普及组那个可以直接表示一位就够了)

    2.辗转相除法(欧几里得算法)

    辗转相除法应该是最简单的数论(数论只会gcd)

    然后实现方式也很简单,是log级别的。

    inline int gcd(int a, int b)
    {
        int temp;
        while (b) temp=a,a=b,b=temp%b;
        return a;
    }
    

    为什么呢?我们假设(ageq b),那么(a{\%}bleq frac{a}{2})

    因此我们这样做的复杂度上限应当最大就是(O(logn))的。

    证明的话

    由裴蜀定理可以推得,(gcd(a,b)=gcd(b,a\%b)),所以我们一直向下直到......(b=0)即可。

    然后(lcm(a,b))的话其实就是(frac{a imes b}{gcd(a,b)})

    3.扩展欧几里得(exgcd)

    这个算法是算一个等式的一组特解

    [xcdot a+ycdot b=gcd(a,b) ]

    然而这个算法其实也是一个log的

    怎么做呢

    就是根据(gcd(a,b)=a(b=0)),然后我们一直先递归求(gcd(a,b)),然后直到某一层(k)会有一个

    [gcd(a,b)cdot x_k+0cdot y_k = gcd(a,b) ]

    显然这个时候(x_k=1,y_k=0)

    那么我们怎么根据这个式子往回回溯求一开始的(x_0,y_0)呢?

    我们可以举一个例子(举第一层的例子吧)

    (acdot x_0+bcdot y_0=gcd(a,b))
    那么下一层就是(bcdot x_1+(amod b)cdot y_1=gcd(a,b))

    我们可以知道((amod b)=a-bcdotiglfloor{frac{a}{b}}ig floor),而且(acdot x_0+bcdot y_0=bcdot x_1+(amod b)cdot y_1)

    替换式子之后会得到(acdot x_0+bcdot y_0=bcdot x_1+(a-bcdotiglfloor{frac{a}{b}}ig floor)cdot y_1)

    拆开,得到(left=acdot y_1+b(x_1-iglfloor{frac{a}{b}}ig floorcdot y_1))

    于是乎因为(a,b)都是一样的

    那么(x_0=y1,y_0=x_1-iglfloor{frac{a}{b}}ig floorcdot y_1)

    回溯就可以了

    代码实现:

    //返回的是gcd(a,b)
    int exgcd(int a,int b,int &x,int &y)
    {
        if (b==0)               //可以直接回溯了
        {
            x = 1, y = 0;
            return;
        }
        int d = exgcd(b, a % b, x, y);
        int temp = x;           //
        x = y;                  //
        y = temp - (a / b) * y; //从下一层向这一层回溯
        return d;
    }
    

    有三个重要的式子,这里就不再赘述 反正我也不会证明

    img

    4.数论分块

    烧脑预警

    首先我们了解(iglfloor{frac{x}{i}}ig floor,iin [1,x])的话是只有(sqrt{x})种取值的。

    至于证明的话,我们可以分([1,sqrt{x}])([sqrt{x}+1,x])两部分

    因为我们知道前半部分是有(sqrt{x})种取值的,那么由于因子是对称的,因此另外一部分也是有(sqrt{x})种取值的。

    因此我们直接开始Emmm...枚举根号次就好了

    代码模板

    void fenkuai(int n)
    {
        for (int i = 1, last; i <= n; i = last + 1)
        {
            int a = n / i;
            last = n / a; // n / (n / i) 是与 n / i相同值的最大i......
            /* your code */
        }
    }
    

    然后呢,这样可以优化某一些枚举(iglfloor{frac{x}{i}}ig floor)的值的数论题目......

    几个例题

    1.求:

    [sumlimits_{i=1}^n(iglfloorfrac{n}{i}ig floor)^3*ipmod {1e9+7} ]

    数据范围:

    [nleq 10^9 ]

    一看只好跑一个数论分块

    首先我们知道上面的结论之后可以直接优化

    就是说((iglfloorfrac{n}{i}ig floor)^3)的取值只有(sqrt{n})种,因此我们合并有这一项的式子,可以得到

    [sumlimits_{i=1}^n(iglfloorfrac{n}{i}ig floor)^3*i = sumlimits_{i=1,i=n/(lfloor n/i floor)+1}^n(iglfloorfrac{n}{i}ig floor)^3*frac{(l+r)cdot(r-l+1)}{2},l=frac{n}{i},r=frac{n}{frac{n}{i}} ]

    这样就直接求了qwq

    (LaTeX打得我心痛)

    算了剩下的例题实在是不想敲了QAQ

    二、质数筛法和欧拉函数

    1.埃拉托色尼筛法

    这个应该是最熟悉的了吧......

    每次拿到一个质数,摁着质数向下筛他的倍数。

    由于质数是log的,质数的倍数是log(log)级别的,因此整个算法的复杂度就是(O(nlog(logn)))的。

    这个算法的最大缺点在于一个数有可能会被筛很多遍

    这是没有必要的鸭

    因此我们设计了一个方式防止重复筛一个数

    只让一个数的最小的因子筛掉他

    2.欧拉筛

    没错就是它。

    我们每次筛掉一个数一定是被最小的因子筛掉除去1是预处理的

    于是我们就可以直接枚举质数p,当i可以被某一个质数筛掉,就停下筛下一个数。

    为什么这样做是对的???

    因为避免了大的质数筛掉较小的数字,保证了每一个数只会被筛一次。

    当然同时我们还可以预处理每一个数的最小的因子,得到这个数组之后我们可以log时间内枚举一个数的所有质因子。

    3.欧拉筛配备积性函数

    这有什么好说的......

    首先积性函数就是指在自然数范围内(f(a)cdot f(b)=f(acdot b))的函数。

    然后的话有欧拉函数和莫比乌斯函数作为积性函数的代表,登上历史舞台。

    代码先鸽这着...

    4.组合数

    组合数当然是开心至极

    那句小葱同学******是什么来着???

    定义(C^n_k)表示在n个元素中取出k个元素的方案数

    通常情况下我们计算组合数都要搭配容斥原理来做各种毒瘤。

    然后这个容斥原理还要搭配莫比乌斯函数来进行毒瘤。

    来个例题

    给定n个数的序列(a_1..a_n),求将序列分成两组使得两组的or和相等(数据保证有解)的方案数。

    数据范围:

    [nleq 50,0leq a_ileq 2^{20} ]

    那岂不是直接就做了(大雾)

    我们按照每一个二进制位考虑

    假设现在我们在检查第i个位,有以下几种情况:

    1. 数据中所有的数这一位都是0或者1
      那么这样就直接不用计数了,怎样分都是一样的......答案乘(C^n_{frac{n}{2}})
    2. 如果不是都是1,那么必须有一组里面的数这一位有1,但是这并不好统计不是吗
      但是我们可以考虑统计补集
      然后套一个并查集就OK了

    代码还是不写

    5.组合八题

    什么毒瘤

    • 小球不等价,盒子不等价,盒子可以为空,有多少种方案?
    • 小球不等价,盒子不等价,盒子不能为空,有多少种方案?
    • 小球不等价,盒子等价,盒子不能为空,有多少种方案?
    • 小球不等价,盒子等价,盒子可以为空,有多少种方案?
    • 小球等价,盒子不等价,盒子可以为空,有多少种方案?
    • 小球等价,盒子不等价,盒子不能为空,有多少种方案?
    • 小球等价,盒子等价,盒子不能为空,有多少种方案?
    • 小球等价,盒子等价,盒子可以为空,有多少种方案?

    具体是什么上网上去查吧......

  • 相关阅读:
    php多态
    ssl certificate problem: self signed certificate in certificate chain
    test plugin
    open specific port on ubuntu
    junit vs testng
    jersey rest service
    toast master
    use curl to test java webservice
    update folder access
    elk
  • 原文地址:https://www.cnblogs.com/jelly123/p/11373679.html
Copyright © 2011-2022 走看看