ユークリッドクラスの研究ノート

効果

実際など、分割及び種類について何かを見つける
\ [\ sum_を{I = 0 } ^ N \ lfloor \ FRACは、{C} \ rfloor、\ sum_ {i = 0} ^ N \ lfloor \ {+ B aiを} \ I \ FRAC AI + B} {} {C \ rfloor \] lfloor = {0} sum_ ^ニッケル\ AI + B} {FRAC {C} \ rfloor ^ 2、
(例のここで3 luoguP5170

GCDを行うには、その名前が、実際には何もないが、複雑さと同じの分析の複雑ながら。複雑さは、したがって、である(O(\ログ\最大(A、C))\)\

最初の式は、実際には線積分点以下第1象限に求めています

アルゴリズム

何も考えは、いくつかの基本的な数学の能力を使用して、式をプッシュすることです。

プッシュが必要上記の3つの式トリック:
\ [\ lfloor \ FRAC AI + B} {} {C \ rfloor = \ lfloor \ FRAC {(A \ BMOD C)、I +(B \ BMOD C)}、{C} \ rfloor + iがlfloorの\のFRAC \
{A} {C} \ rfloor + \ lfloor \ FRAC {B}、{C} \ rfloor \\ X ^ 2 = 2 \ sum_ {D = 0} ^ ND-X \] 最初非常に良好な発現を示し、a、bは、単純に形成するために、KC + Rに置いています。

第2の式は次総和を加算することによって除去される、立方共感は、同様の方法を排除することができます。交換後のシーケンスを合計することによって簡略化することができます。

考えそのようなものは2つのカテゴリに分類:BがC以上であり; A及びBはCよりも小さいです。

\(\ GE Cは\または\ BのGeのC \ \)

漸化式の適用は、(%のC、Bの%のC、C、N)に(A、B、C、N)から容易になります。

\(B <C \)

ディスカバリー(\ \ lfloor \ FRAC AI + B}は{} {C \ rfloor \ N-LE \) この狭い範囲を使用することができます。オーダー\(M = \ lfloor FRAC \ {AN + B}、{C} \ rfloor \):\
[F(A、B、C、N-)= \ sum_ {I = 0} ^ N- \ lfloor \ FRAC {AI + B}、{C} \ rfloor \\ = \ sum_ {i = 0} ^ n個の\ sum_ {D = 0} ^ {M-1} [\ lfloor \ rfloor \ FRAC {+ B aiを} {C} \ GE D + 1] \\ = \ sum_ {D = 0} ^ {M-1} \ sum_ {i = 0} ^ N [I> \ lfloor \ FRAC {CD + CB-1} {A} \ rfloor] \ \ = \ sum_ {D = 0 } ^ {M-1} -N - \ lfloor \ FRAC {CD + CB-1} {A} \ rfloor \\ = N * M - F(C、CB-1、 M-1)\]
第一工程における重要事実、述語は、(実際には重要である\(X- = \ sum_ {D} = ^ 1 X1の\) )。後者は非常に明らかです。彼は押しました。
\ [G(A、B、 C、N)= \ sum_ {i = 0} ^ N \ lfloorの\のFRAC {AI + B}、{C} \ rfloor ^ 2 \\ = \ sum_ {i = 0} ^ N2 \ sum_ {D = 1} ^ {\ lfloorの\のFRAC {AI + B}、{C} \ rfloor} D - \ lfloor \ FRAC {AI + B}、{C} \ rfloor \\ = 2 \ sum_ {D = 0 } ^ {M-1} D + 1 \ sum_ {i = 0} ^ N [\ lfloorはFRAC \ {+ B aiを} {C} \ rfloor \ GEのD + 1] - F(A、B、C、D )\ \]
ここで、上記第二の式を用います。他の人がそれらを繰り返さない、似ています。

アプリケーション

luoguP5170

其中
\ [F = \ sum_ {i = 0} ^ N \ lfloor \ FRAC {AI + B}、{C} \ rfloor、G = \ sum_ {i = 0} ^ N \ lfloor \ FRAC {AI + B} { C} \ rfloor ^ 2、H = \ sum_ {i = 0} ^ NI \ lfloor \ FRAC {AI + B}、{C} \ rfloor \]

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
typedef long double LD;
typedef pair<int,int> pii;
typedef pair<LL,int> pli;
const int SZ = 1e6 + 10;
const LL INF = 1e15 + 10;
const int mod = 998244353;
const LD eps = 1e-8;

LL read() {
    LL n = 0;
    char a = getchar();
    bool flag = 0;
    while(a > '9' || a < '0') { if(a == '-') flag = 1; a = getchar(); }
    while(a <= '9' && a >= '0') { n = n * 10 + a - '0',a = getchar(); }
    if(flag) n = -n;
    return n;
}


struct node {
    LL f,g,h;
};

struct LO {

    const LL inv2 = 499122177;
    const LL inv6 = 166374059;

    LL F1(LL n) {
        n %= mod;
        return n * (n+1) % mod * inv2 % mod;
    }

    LL F2(LL n) {
        n %= mod;
        return n * (n+1) % mod * (2*n+1) % mod * inv6 % mod;
    }

    node solve(LL a,LL b,LL c,LL n) {
        LL f,g,h;
        if(a == 0) {
            n %= mod;
            f = (b/c%mod) * (n+1) % mod;
            g = (b/c%mod) * (b/c%mod)%mod * (n+1) % mod;
            h = (b/c%mod) * F1(n) % mod;
        }
        else if(a>=c || b>=c) {
            node t = solve(a%c,b%c,c,n);
            f = (t.f + F1(n)*(a/c%mod)%mod + ((n+1)%mod)*(b/c%mod)%mod) % mod;
            g = (F2(n)*(a/c%mod)%mod*(a/c%mod)%mod + ((n+1)%mod)*(b/c%mod)%mod*(b/c%mod)%mod + t.g
                  + 2*F1(n)*(a/c%mod)%mod*(b/c%mod)%mod + 2*(a/c%mod)*t.h%mod + 2*(b/c%mod)*t.f%mod) % mod;
            h = (t.h + F2(n)*(a/c%mod)%mod + F1(n)*(b/c%mod)%mod) % mod;
        }
        else {
            LL m = (a*n+b)/c;
            node t = solve(c,c-b-1,a,m-1);
            m %= mod;
            f = (n*m%mod - t.f) % mod;
            g = (2*n*F1(m)%mod - 2*(t.h+t.f) - f) % mod;
            h = (F1(n)*m%mod - (t.g+t.f)*inv2%mod) % mod;
        }
        f += mod; f %= mod;
        g += mod; g %= mod;
        h += mod; h %= mod;
        return (node){f,g,h};
    }
}lo;

int main() {
    int T = read();
    while(T --) {
        LL n = read(),a = read(),b = read(),c = read();
        node ans = lo.solve(a,b,c,n);
        printf("%lld %lld %lld\n",ans.f,ans.g,ans.h);
    }
}

おすすめ

転載: www.cnblogs.com/dqsssss/p/11300850.html