• 模拟7 题解


    A. 方程的解

    a,b均为正整数,exgcd求出x最小和最大的解。

    作差后除公差再加一,就是方程的解的数量。

    对于a,b,c中存在0或负数的情况,疯狂加特判。

    B. visit

    共走t步,要求到达坐标$(n,m)$。

    即总共向上走了n步,向右走了m步。

    设u为向上走步数,d为向下走步数,l为向左,r为向右。

    则有:

    $u-d=n$

    $r-l=m$

    $u+d+l+r=t$

    如果t-n-m为奇数,则不可能存在一种方案用t步到达$(n,m)$,

    因为无法将剩余的步数均等地分配给向上和向下,向左和向右。

    枚举其中任意一个,即可利用组合数求解,将答案求和。

    $ans=sum limits_{i=n,2|(i-n)}^{t-m} inom{t}{i} inom{i}{frac{i-n}{2}} inom{t-i}{frac{t-i-m}{2}}$    

    本题 膜 数不保证是质数,但保证是不同质数的乘积。

    对每个质因子使用lucas定理求出结果,将结果用crt合并就是最终的答案。

    题中没保证n,m是正数,但n,m为负的情况与均为正数等价,注意转换。

    C. 光

    60分算法

    暴力模拟。

    按照题面中说的做,遇到未经过的点时,$ans++$。

    对每一个方格,来自每一个方向的情况,

    开一个bool数组判断是否经过过。

    当遇到已经经过的,即已经有循环,break退出即可。

    考虑如何优化暴力。

    设这几种情况分别为1,2,3,4。

    首先通过手玩,发现一些性质:

    性质1

    当且仅当光线遇到情况2,4,每个方格会被来自相对两个方向的光线经过。

    如果不遇到情况2,4,每个方格仅会被一个方向的光线经过。

    证明:

    设(x,y)为四个格子交界处的格点坐标。

    考虑向每个方向移动 对x+y的贡献,

    x y均+1或-1,x+y的奇偶性不变。

    x y分别+1 -1,x+y的奇偶性不变。

    于是全程中x+y的奇偶性不会改变。

    所以每个方格周围只有两个格点可能被经过,

    也就最多被来自两个相对方向的光线经过。

    性质2

    光线在无转向的运动过程中,

    x+y不变,或x-y不变。

    性质3

    由于障碍只有k个,边界的数量只与n,m线性相关。

    障碍物的每个方向至多反弹一次。

    光线的总反弹次数与n,m,k线性相关。

    根据性质2,我们对每个x+y,x-y都开一个set(或经过排序的vector),

    将每个障碍物(包括边界)插入对应的set,可以通过二分查找前驱后继,

    在一次转向后可快速找到下次转向的位置。

    打一堆恶心的特判处理转向位置,统计答案。

    光线的总反弹次数与n,m,k线性相关,所以复杂度是可以接受的。

    当与起点方向方向相同时走到起点时,可以跳出循环。

    记录是否遇到过情况2,4,

    如果存在,将ans/2。

    复杂度$O(NlogN)$

  • 相关阅读:
    团队开发冲刺第十五天
    团队开发冲刺第十四天
    团队开发冲刺第十三天
    团队开发冲刺第十二天
    团队开发冲刺第十一天
    团队开发冲刺第十天
    幸运抽奖案例
    java中如何数组是如何赋值的?
    使用java中的String类操作复杂的字符串
    java中随机生成26个字母组合的随机验证码
  • 原文地址:https://www.cnblogs.com/skyh/p/11227218.html
Copyright © 2020-2023  润新知