zoukankan      html  css  js  c++  java
  • 题解-ZeroJudge-c686 高斯符號

    Problem

    ZeroJudge

    Solution

    考慮到(lfloor frac {km}n floor)等同於(km)整除(n),換種表示方法就是(km)減去(km)(n)的餘數,再除以(n)

    那麼原式等價於:

    [sum_{k=1}^nfrac {km-(km mod n)}n ]

    這時那根分數線代表的除法是沒有餘數的除法,不受到餘數的幹擾,所以將其提出來:

    [frac {sum_{k=1}^nkm-(kmmod n)}n ]

    再將sigma裏面的東西拆開,得到:

    [frac {msum_{k=1}^nk}n-frac {sum_{k=1}^n(kmmod n)}n ]

    左邊的式子等比數列求和得(frac {msum_{k=1}^nk}n=frac {m(n+1)}2)

    接下來考慮右邊的式子,由於求餘操作在求和的裏面,所以不能先求和再整體取餘(前者結果可能大於等於n,後者結果嚴格小於n)

    但是發現(k)的上限是(n),正好是的模數,即當(k=n)時,(kmmod n=0);再考慮到當(k=0)時,(kmmod n=0);即(kmmod n)的循環節一定是(n)的約數,再根據裴蜀定理,(km)在模(n)意義下關於(k)的循環節爲(n)(m)的最大公約數,設爲(d)(即(k)加上(d)的倍數,相應的(kmmod n)的值仍然相等)

    在上面的條件下,發現(kmmod n)的取值集合爲({td|tin [0,frac nd)}),而且在一個循環節下集合內的每個數都會取到一次

    考慮到循環節長度爲(frac nd),而且(d)一定爲(n)的約數,所以(k)(1)(n),可以得到(d)個循環節

    所以只要將一個循環節內的所有數加起來,乘以(d)即爲右邊式子的答案,集合內元素和用求和公式,爲(frac {(0+n-d)frac nd}2),再乘以循環節數量(d),除以原來就要除的(n),得到(frac {n-d}2)

    結合左邊和右邊的式子,最終答案爲(frac {m(n+1)}2-frac {n-d}2=frac {nm+m-n+d}2)

    式子都這麼短了,代碼就不貼了啦

  • 相关阅读:
    Java 对文件的操作
    快速排序算法
    Java 时间和字符换的处理
    Redis 数据结构之Keys
    [转] Redis系统性介绍
    【转】JAVA 接口
    [转] Python 代码性能优化技巧
    几道关于面试的题目
    随手笔记2
    随手笔记
  • 原文地址:https://www.cnblogs.com/penth/p/9568420.html
Copyright © 2011-2022 走看看