zoukankan      html  css  js  c++  java
  • [题解] LuoguP1587 [NOI2016]循环之美

    https://www.luogu.com.cn/problem/P1587

    神仙题...

    首先我们只要考虑所有最简分数就好了,也就是((a,b)=1)(frac{a}{b})

    然后答案就是

    (sumlimits_{i=1}^n sumlimits_{j=1}^m [gcd(i,j)=1)(frac{i}{j})(k)进制下是纯循环小数(])

    (下面令({ x})表示(x)的小数部分)

    考虑一个最简分数(frac{x}{y}),它的小数部分({ x/y})显然是((x mod y)/y)

    注意到(k)进制下将一个数左移一位相当于乘一个(k),设分数(x/y)循环节的长度为(r),那么必然有

    (k^r x mod y = x mod y)

    由于((x,y)=1),两边同时乘一个(x^{-1})可得

    (k^r equiv 1 pmod y)

    也就是存在整数(r,q)(r>0)),满足(k^r - qy=1)

    ((k^r,y)=1),发现这个成立当且仅当((k,y)=1)

    然后就可以推柿子辣

    [egin{aligned}Ans&=sumlimits_{i=1}^n sumlimits_{j=1}^m [gcd(i,j)=1][gcd(j,k)=1]\&=sumlimits_{j=1}^m[gcd(j,k)=1]sumlimits_{i=1}^n [gcd(i,j)=1]\&=sumlimits_{j=1}^m[gcd(j,k)=1]sumlimits_{i=1}^n sumlimits_{d mid gcd} mu(d)\&=sumlimits_{d}mu(d)lfloorfrac{n}{d} floorsumlimits_{j=1}^{lfloor m/d floor} [gcd(jd,k)=1] end{aligned} ]

    看后面那个(j),貌似不太好推了...

    但注意到(gcd(jd,k)=1)等价于(gcd(j,k)=1)(gcd(d,k)=1),所以

    [egin{aligned} Ans&=sumlimits_{d} mu(d)lfloorfrac{n}{d} floorsumlimits_{j=1}^{lfloor m/d floor} [gcd(j,k)=1][gcd(d,k)=1]\&=sumlimits_{d} lfloorfrac{n}{d} floormu(d)[gcd(d,k)=1]sumlimits_{j=1}^{lfloor m/d floor} [gcd(j,k)=1]end{aligned} ]

    还是不太好做...但不要放弃梦想...

    (f(n)=sum_{i=1}^n [gcd(i,k)=1])

    (g(n,k)=sum_{i=1}^n mu(i)[gcd(i,k)=1])(这里为什么是(n,k)?往下看呗...)

    如果能快速搞出这两个东西我们就能数论分块了...

    先来看(f(n))

    考虑两个数互质(a,b),写成带余除法的形式(a=bq+r)

    由于(a,b)互质,所以(r,b)也必须互质(不然直接提个公因子出来,与((a,b)=1)矛盾)。

    所以((a,b)=1)等价于((a mod b,b)=1),那么(f)也很显然啦,每(k)个数是一个循环,所以

    (f(n)=lfloorfrac{n}{k} floor f(k) + f(n mod k))

    暴力算出(f(0...k))即可

    然后是(g(n,k))

    中间又有个(gcd)?我们推一波柿子

    [egin{aligned} g(n,k)&=sumlimits_{i=1}^n mu(i)sumlimits_{d mid i ext{且} dmid k} mu(d)\&=sumlimits_{d mid k} mu(d) sumlimits_{i=1}^{lfloorfrac{n}{d} floor} mu(id)end{aligned} ]

    后面有个(id)...然后又不会了...

    注意到(mu)是一个积性函数对于(gcd(a,b)=1),有(mu(ab)=mu(a)mu(b)),如果(a,b)不互质呢,根据莫比乌斯函数的定义,显然(mu(ab)=0)

    于是

    [egin{aligned}g(n,k)&=sumlimits_{dmid k} mu(d) sumlimits_{i=1}^{lfloorfrac{n}{d} floor} mu(d)mu(i)[gcd(i,d)=1]\&=sumlimits_{d mid k} mu(d)^2 sumlimits_{i=1}^{lfloorfrac{n}{d} floor}[gcd(i,d)=1]mu(i)end{aligned} ]

    你看看后面那一坨...

    不就是(g(lfloorfrac{n}{d} floor,d))嘛!

    没想到吧...

    然后(g(n,k)=sum_{dmid k} mu(d)^2 g(lfloor n/d floor,d))

    边界情况就是(g(n,1)=sum_{i=1}^n mu(i)),这种直接杜教筛就好了

    然后就做完了...

    复杂度不会算...

    被卡的话算(g)的时候注意特判一下(mu(d)=0)就不用递归了

    跑的贼慢的(Code): https://paste.ubuntu.com/p/GhbXXnVXmJ/

  • 相关阅读:
    js函数动态传参
    js 异步加载
    js 遍历
    安卓——implements——OnClickListener
    安卓——BroadcastReceiver
    关于Linux下的硬链接
    Linux 的文件类型
    linux 学习
    虚函数与重载函数的区别
    虚函数和友元
  • 原文地址:https://www.cnblogs.com/wxq1229/p/12814329.html
Copyright © 2011-2022 走看看