2018/8/2训练日记 附带了一个佩尔方程知识点

今天上午又重新看的分块和莫队,分块思想基本上可以掌握了

做了几个例题cdoj1324,bzoj3343,bzoj2906,

还看了哔哩哔哩上的qscqesze的讲解分块感觉讲的非常的好

代码思路非常的清晰。

另外莫队这个思想,看了看正常的莫队,还有树上莫队,带修改的莫队等等,

还有回滚莫队,不过没找到例题去看,cdq分治还没看

下午的牛客多校题,前面做的挺正常的,后面因为一个01分数规划还有一个费用流

卡到了比赛结束,那个01分数规划属于知识点遗漏,而且比赛的时候一直往贪心那方面想了,

再就是下面那个E的费用流,也是没想到,比赛完之后看的题解才知道是这样

另外再补一个佩尔方程的知识点:
求佩尔方程最小解

1.佩尔方程:

形如x2-D*y2=1(D是一个固定的正整数且D不是完全平方数)的方程称为佩尔方程

2.佩尔方程定理:

佩尔方程总有正整数解,若(x1,y1)是使x1最小的解,则每个解(xk,yk)都可以通过取幂得到: 
xk + yk*sqrt(D) = (x1 + y1*sqrt(D))k 
也有:xn+1 = x0xn + Dy0yn, yn+1 = y0xn + x0yn; 
xn+2 = 2x0xn+1-xn,yn+2 = 2x0yn+1-yn

3.连分数: 
一个数字可以表示成以下形式: 
这里写图片描述 
称为连分数,简记为[a0,a1,a2,a3,a4,a5,a6]则 
Pi = [3,7,15,1,292,1,1,1,2,1,3,1,14,2,1,1,2,……] 
21/3 = [1,3,1,5,1,1,4,1,1,8,1,14,1,10,2,1,4,12,2,3,2,……] 
21/2 = [1,2,2,2,2,2,2,2,2,2,2,2,2……] 
e = [2,1,2,1,1,4,1,1,6,1,1,8,1,1,10,1,1,12,1,1,14……] 

bool PQA(LLI D, LLI &p, LLI &q) {//来自于PQA算法的一个特例
    LLI d = sqrt(D);
    if ((d + 1) * (d + 1) == D) return false;
    if (d * d == D)             return false;
    if ((d - 1) * (d - 1) == D) return false;//这里是判断佩尔方程有没有解
    LLI u = 0, v = 1, a = int(sqrt(D)), a0 = a, lastp = 1, lastq = 0;
    p = a, q = 1;
    do {
        u = a * v - u;
        v = (D - u * u) / v;
        a = (a0 + u) / v;
        LLI thisp = p, thisq = q;
        p = a * p + lastp;
        q = a * q + lastq;
        lastp = thisp;
        lastq = thisq;
    } while ((v != 1 && a <= a0));//这里一定要用do~while循环
    p = lastp;
    q = lastq;
    //这样求出后的(p,q)是p2 – D * q2 = (-1)k的解,也就是说p2 – D * q2可能等于1也可能等于-1,如果等于1,(p,q)就是解,如果等于-1还要通过(p2 + D * q2,2 * p * q)来求解,如下
    if (p * p - D * q * q == -1) {
        p = lastp * lastp + D * lastq * lastq;
        q = 2 * lastp * lastq;
    }
    return true;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值