zoukankan      html  css  js  c++  java
  • 7.19

     

    如果不用树形dp,怎么做?

    我们要使得士兵数量最少,那每个士兵要覆盖尽量多的节点

    我们找到最深的叶子节点

     

    就是红色节点

    我们以左边这个为例,如果要覆盖它,有4种放法

    节点上的数字是第几种放法

    显然情况四覆盖的节点最多

    所以我们找到深度最深的节点,在它的爷爷上放上士兵,然后把它爷爷覆盖到的节点从树上删掉,然后重复这个操作,直到树为空

    我们维护一个堆就可以做到删除节点

    复杂度:O(nlogn)

    染色方案是个什么意思?

    如果我们有k种分组方案,每种方案都有M种颜色可以染,那最终的染色方案就Mk

    举个栗子:N=6时,有4种分组方案,答案就是M的4次方

    4种:1组,每组6人

             2组,每组3人

             3组,每组2人

             6组,每组1人

    所以有多少种方案就是看N有多少个因数

    可以for一遍,O(√n)计算有多少个因子

    然后快速幂计算Mk

    增强版

    在上面我们没有考虑人的顺序

    所以我们考虑人的顺序

    例子:

    例如上面的分两组,就有了三种分法(其实不全)

    怎么算?

    假设我们现在要把这些人分成r组

    第一组的方案数

    第二组:这里因为第一组已经有N/r个人了,所以这里是N-N/r

    第三组:因为又少了N/r个人,所以是N-2N/r

    第n组:到最后只剩下N/r个人了

    我们发现这里考虑了每组的顺序,所以我们还要在除以r!(例如这么算会有(123,456)和(456,123),但它们是同一种情况)

    r!是r组的全排列

    最终式子

    那这玩意咋算呢?

     把组合数拆一下

    以上是按照组合数公式拆分

    我们发现可以约分

    约分

     分r组的最终式子:

    k的最终式子:

    最后求的是Mk%(109-401)

    那我们的k应该模多少呢?(109-401)?

    我们想起推逆元时用的欧拉定理:

    Mφ(1e9-401)≡1 (mod 109-401)

    那Mk≡Mk%φ(1e9-401)  (mod 109-401) 

    那问题就转换成了这样

    我们发现N!没法算(N是2*109

    这个题的模数很奇怪啊

    它会不会是一个质数?

    它的确是个质数

    那φ(109-401)=109-402

    进行一番分解质因数操作

     

    它的质因子都在10000以内,还不算太大

    我们可以算N!mod这四个数分别是多少,然后乘起来,就是N!%109-402

    问题进一步被转化为N!%一个数是多少

    假设我们要算N!%13

    我们把N!奋进成这样的形式

    我们尝试把1~N中所有的数%13(对13的倍数特殊处理)

    现在我们的模数很小,所以会有循环节(指1~N中的数%13之后会有循环节)

    我们先不考虑13的倍数,那假设我们有q个循环节,则最后的答案(不包括13的倍数)

    是(12!)q%13

    我们再考虑13的倍数,把它们都拿出来,全部/13,把剩下的数%13计算

    发现就是刚才的问题,那重复刚才的操作

    这样就可以递归操作

    复杂度log13N

    大佬的式子(di就是要%的数)

    n!=1*2..(di-1)*di*(di+1)*..*(q*di)*(q*di+1)...*n (mod di)

                   =((di-1)! mod di)^q*(n-q*di)!*q!*(di)^q ( mod di)

                   =(-1)^q*(n-q*di)!*q!*di^q ( mod di)

    以下是对第二步的分析

    ((di-1)! mod di)^q:上面刚讲了

    (n-q*di)!:因为N不一定是di的倍数,所以n-q*di相当于n%di(计算剩下的“尾巴”)(例如n=1000,di=13的时候,q=7,n-q*di=n%di=9,因此9就是这里的“尾巴”,这里(n-q*di)!就是9!)

    q!*(di)^q ( mod di):窝也不会了咕咕咕

     

    这是个Nim石子问题

    我们先随便砍一刀

    这么砍相当于把黑格子到上边的距离变短

    同理,在哪边砍,就相当于把黑格子到哪边的距离变短

    这就相当于有四堆石子的Nim石子游戏问题,石子数量分别是(x-1),(y-1),(n-x),(m-y)

    于是就可以把这四个都异或起来,就可以判定先手是否必胜

    但是题目问有几种

    我们可以枚举啊

    emmmmm

    好大啊

    长者说我国是数据结构强国,所以我们可以用数据结构(雾)

    把式子变形

     枚举所有的x,把左边算出来的数塞到数组里,然后就枚举y,看右边的结果在数组里出现了多少次

    可以搞个桶排一般的数组,或者是排序后二分

    安利网站codechef.com(CC)

    分组不要求连续

    哥德巴赫猜想?!

    第二个已经被证明(证明见百度)

    第一个在long long范围内是对的

    一到n中所有数的和

    s是偶数:输出2

    s是奇数:N=2:s是质数:输出1

                    N≠2:看能拆成2个还是3个质数

                   拆成两个质数:这两个质数中一定有一个是2,所以看s-2是不是质数,如果是,输出2,不是,输出3 

    平面最远点对???(才没有辣么难)

    先看看什么是曼哈顿距离

    我们不知道是第一头牛的y大还是第二头牛的y大

    于是就有了两种情况

    第一种情况是第一头牛的y大于第二头牛的y

    第二种情况是第二头牛的y大于第一头牛的y

    所以我们先按x+y排序,最大的减最小的,再按x-y排序,最大的减最小的

     

    不考虑复杂度神马的,我们可以算出来从第一个城市到第二个城市有多少条边

    转移考虑从哪个点走过来

    意思就是从起点走i步到j,中间一定会从起点走到k,再走一步到j,我们就枚举中间点k

    复杂度:大概1024

    能不能再快一点

    如果把经过i条路到达的点的方案数看做一个矩阵

    复杂度:O(n3logd)(大概1010

    还是慢了点

    我们看题目中别扭的地方

    算a到b的道路数目很鬼畜,而且复杂度还和k没有关系

    那我们从k入手进行优化

     我们在存的时候就换一下维度,然后发现这时矩阵乘法

    M=out*in

    但是现在还是要n3,还是过不了

    我们暴力的把括号打开

    矩阵有结合律,所以可以随便加括号

     

    现在in*out就是k*k的矩阵

    然后复杂度就变成了O(k3logd)

    给一棵n个点的树,每个点有点权,保证点权在int范围内,有m次询问,每次给出两个点p1,p2,能否在p1到p2的路径上找出三个点,使得这三个点的点权能为一个三角形的三边长度

    正难则反,我们想怎么不能构成三角形

    如果出现这种情况就不能构成三角形了

    当取等号的时候,就是斐波那契数列了

    斐波那契数列是不能够组成三角形,而且每个点的点权尽可能小的情况

    我们注意到题目里说了每个点的点权小于int ,那我们沿着斐波那契数列写下去,发现会有f43(大概是这个数)爆int,那下一个路径上的点权一定是在int以内,此时一定可以组成三角形,因此如果路径上点的数量超过42,就一定能够构成三角形。

    否则呢?暴力呗。

    找路径:当然是倍增求LCA辣

    求个毛啊一步一步跳就好了反正不超过42步还好写

  • 相关阅读:
    第一个python的GUI程序
    vbs实现打开记事本,写入一些文字,复制然后关闭
    自己制作的autoitX的vbs脚本,用来自动配置金山毒霸2011局域网更新
    使用免费的unrar.exe解压rar文件
    初学写的几个autoit小程序
    vba调用AutoItX3的Activex控件,实现doc2Html源码
    网页制作相关工具
    vbs自动登陆115网盘代码
    深搜和宽搜的c++实现
    入职一个月有感
  • 原文地址:https://www.cnblogs.com/lcez56jsy/p/11212077.html
Copyright © 2011-2022 走看看