zoukankan      html  css  js  c++  java
  • 洛谷P1587 [NOI2016]循环之美

    神仙题目

    给定(n,m),求有多少数值上互不相等的可以表示成(frac{x}{y})的数,满足(1≤x≤n,1≤y≤m),且(frac{x}{y})(k)进制下是纯循环小数(特别地,整数也是纯循环小数)
    (1≤n,m≤10^9,2≤k≤2000)

    首先要求数值上互补相等,即要求(x⊥y)

    又要满足纯循环小数,假设循环节长为(l),那么(frac{k^lx}{y}-lfloorfrac{k^lx}{y} floor=frac{x}{y}-lfloorfrac{x}{y} floor)

    两边同乘一个(y)(k^lx-lfloorfrac{k^lx}{y} floor y=x-lfloorfrac{x}{y} floor y)

    在膜法作用下(k^lx≡x mod y)

    又因为(x⊥y),所以(k^l≡1 mod y)

    此时我们假设(gcd(k,y)=d),那么(k=k_1d,y=k_2d)

    (k_1^ld^l≡1 mod y)

    所以(k_2d|(k_1^ld^l-1))

    又因为(k_1⊥k_2),所以(d|(k_1^ld^l-1))

    此时说明右边等于(k_3d),得出(1)(d)的倍数

    所以(y⊥k)

    问题就变为了,求

    [sumlimits_{i=1}^{n}sumlimits_{j=1}^{m}[i⊥j][j⊥k] ]

    这个(i⊥j)显然可以反演

    [sumlimits_{j=1}^{n}[j⊥k]sumlimits_{i=1}^{m}sumlimits_{d|i,d|j}mu(d) ]

    我们变为枚举(d)

    [sumlimits_{d=1}^{n}mu(d)sumlimits_{d|i}sumlimits_{d|j}[gcd(j,k)==1] ]

    我们把(d)提出来,但是记得(d)也要和(k)互质

    [sumlimits_{d=1}^{n}[gcd(d,k)==1]mu(d)sumlimits_{i=1}^{lfloorfrac{n}{d} floor}sumlimits_{j=1}^{lfloorfrac{m}{d} floor}[gcd(j,k)==1] ]

    (i)没用了,化简掉

    [sumlimits_{d=1}^{n}[gcd(d,k)==1]mu(d)lfloorfrac{n}{d} floorsumlimits_{j=1}^{lfloorfrac{m}{d} floor}[gcd(j,k)==1] ]

    此时我们设(S(n,k)=sumlimits_{i=1}^{n}mu(i)[gcd(i,k)==1],f(n)=sumlimits_{i=1}^{n}[gcd(i,k)==1])

    [sumlimits_{d=1}^{n}[gcd(d,k)==1]mu(d)lfloorfrac{n}{d} floor f(lfloorfrac{m}{d} floor) ]

    只要快速算出特殊点处(S(n))(f(n))的值,就可以除法分块了

    先来考虑(f(n))怎么求

    由于(gcd(i,k)==gcd(i+k,k)),所以(f(n)=f(k)*lfloorfrac{n}{k} floor+f(n\%k))预处理出(n≤k)(f(n))就可以(O(1))计算了

    然后是(S(n,k)),它等于(sumlimits_{i=1}^{n}mu(i)[gcd(i,k)==1])

    反演一下(S(n,k)=sumlimits_{i=1}^{n}mu(i)sumlimits_{d|i,d|k}mu(d))

    优先枚举(d),得到(S(n,k)=sumlimits_{d|k}mu(d)sumlimits_{d|i}mu(i))

    将后面改为枚举倍数(S(n,k)=sumlimits_{d|k}mu(d)sumlimits_{i=1}^{lfloorfrac{n}{d} floor}mu(id))

    根据莫比乌斯函数性质,当且仅当(i⊥d)(mu(id))不为(0),所以(S(n,k)=sumlimits_{d|k}mu(d)^2sumlimits_{i=1}^{lfloorfrac{n}{d} floor}mu(i)[i⊥d])

    发现后面这个其实就是(S(lfloorfrac{n}{d} floor,d)),那么就可以递归求解了

    但是递归边界(d=1)时怎么办呢

    (S(n,1)=sumlimits_{i=1}^{n}mu(i)[gcd(i,1)==1]=sumlimits_{i=1}^{n}mu(i)),这不就是杜教筛吗!

    那么

    [sumlimits_{d=1}^{n}[gcd(d,k)==1]mu(d)lfloorfrac{n}{d} floor f(lfloorfrac{m}{d} floor) ]

    就可以除法分块解决了

    然而我又发现了一种更神仙地求(S(n,k))的方法!

    (g(n)=[gcd(n,k)==1],S(n)=sumlimits_{i=1}^{n}mu(i)g(i))

    那么(sumlimits_{i=1}^{n}g(i)*S(lfloorfrac{n}{i} floor)=sumlimits_{i=1}^{n} sumlimits_{j=1}^{lfloorfrac{n}{i} floor}g(i)mu(j)g(j))
    (d=i*j)
    (=sumlimits_{d=1}^{n}sumlimits_{i|d}g(i)*mu(lfloorfrac{d}{i} floor)*g(frac{d}{i}))

    由于(g)是完全积性函数,所以(=sumlimits_{d=1}^{n}sumlimits_{i|d}*mu(lfloorfrac{d}{i} floor)*g(d))

    又因为(mu*1=e),所以(=g(1)=1)

    所以(S(n)=1-sumlimits_{i=2}^{n}g(i)*S(lfloorfrac{n}{i} floor))

    我们发现(sumlimits_{i=1}^{n})就是(f(n)),所以可以直接杜教筛!

  • 相关阅读:
    写给自己的话
    软件开发之技能梳理
    《创新者的窘境》读书笔记
    我的四年踩坑史以及思考
    认识问题和求解问题的一种思考框架
    《时间的秩序》读书笔记
    从JSON中自动生成对应的对象模型
    考考你:一道题引发的小思考
    哈!如果一生只如花样短暂
    使用正则表达式抽取所需文本
  • 原文地址:https://www.cnblogs.com/knife-rose/p/12024490.html
Copyright © 2011-2022 走看看