公約数

トピックスアドレス
ああ、ドゥは、事前に最適化することができ、画面に彼の家族を教えたこのトピックでは、シリーズを見たいと思っていません、質問は杜の画面を教える知らない人ではないです\(O(N ^ \ FRAC {2} {3})\)

あなたを怖がらせるために、我々は尋ねます:

\ [\ sum_ {i = 1} ^ n個の\ sum_ {J = 1} ^ m個の\ sum_ {k = 1} ^ P \ GCD(iはCDOT jを\、I \ CDOT K、J \ CDOT K)\時間\ GCD(I、J、K)\回(\ FRAC {\ GCD(I、J)} {\ GCD(I、K)\倍\ GCD(J、K)} + \ FRAC {\ GCD(私を残し、\します、K)} {\ GCD(i、j)の時間\ GCD \(J、K)} + \ FRAC {\ GCD(J、K)} {\ GCD(i、j)の時間\ \ GCD(I、K )}\右)\]

我々は作る(X = GCD(I、\ \(I、K)、Z = GCD(j、k)はj)は、Y = GCD)

于是我们有:
\ [\ sum_ {i = 1} ^ n個の\ sum_ {J = 1} ^ m個の\ sum_ {k = 1} ^ P \ GCD(iは、CDOT jを\ I \ CDOT K、J \ CDOT K )倍\ GCD \回(I、J、K)(\ \ FRAC {X} {Yの\時間はZ} + \ FRAC {Y} {X \回Z} + \ FRAC {Z} {X \回左、\ Y} \右)\]
\ [\ sum_ {i = 1} ^ n個の\ sum_ {J = 1} ^ m個の\ sum_ {k = 1} ^ P \ GCD(iはCDOT jを\、私は\ CDOT K、J \ CDOT K)\回\ GCD(I、J、K)\回\ FRAC {X ^ 2 + y ^ 2 + Z ^ 2} {Xの\倍Y \回Z} \]

第佗柿病人の展開は、得ることができる:
\ [GCDが(私はCDOT J \、IはCDOT K、J \ CDOT K \)= \ {X FRAC \タイムズY \ Z} {タイムズGCD(I、J、 K)} \]

(で実績のある独自の分解定理展開します)

だから我々は我々が単に必要であることを見つけるために驚いた\((\)の還元\(X、Y、Z)を\)

\ [\ sum_ {i = 1} ^ n個の\ sum_ {J = 1} ^ m個の\ sum_ {k = 1} ^ PのGCD(I、J)^ 2 + GCD(J、K)^ 2 + GCD(I 、K)^ 2 \]

私たちは、柿別途書き、取得します:

\ [\ sum_ {i = 1} ^ n個の\ sum_ {J = 1} ^ m個の\ sum_ {k = 1} ^ PのGCD(I、J)^ 2 + \ sum_ {i = 1} ^ n個の\ sum_ { J = 1} ^ m個の\ sum_ {k = 1} ^ pgcd(J、K)^ 2 + \ sum_ {i = 1} ^ n個の\ sum_ {J = 1} ^ m個の\ sum_ {k = 1} ^ P GCD(I、K)^ 2 \]

以降\(GCD(I、J) \) K(他の同様に)独立したと、私たちがpに、Kを作ることができる(\ \ sum_ {i = 1 } ^ n個の\ sum_ {J = 1} ^ M GCD(i、j)が^ 2 \) を追加するので、そこにあるされています。

\ [Pの\時間\ sum_ {i = 1} ^ n個の\ sum_ {J = 1} ^ m個のGCD(I、J)^ 2 + n回\ \ sum_ {J = 1} ^ m個の\ sum_ {k = 1 } ^ pgcd(J、K)^ 2 + M回\ \ sum_ {i = 1} ^ n個の\ sum_ {k = 1} ^ PのGCD(I、K)^ 2 \]

\(F(N、M)= \ sum_ {i = 1} ^ n個の\ sum_ {J = 1} ^ m個のGCD(I、J)^ 2 \)

原式\(= P \回F(N、M)+ N \倍F(P、M)+ Mの\倍F(N、P)\)

そこで問題は、迅速に変換を決定する方法である\(F.(N、M)を\) 設定したい場合(≤N-Mの\)\を

\ [F(N、M)= \ sum_ {D = 1} ^ n個の\ sum_ {i = 1} ^ n個の\ sum_ {J = 1} ^ mdの^ 2 \回[GCD(i、j)は== D ] \]

\(I、Jの\)同時にDで除しました。

\ [F(N、M)= \ sum_ {D = 1} ^ n個の\和^ {N / D} _ {i = 1} \和^ {M / D} _ {J = 1} D ^ 2 \時間[GCD(i、j)は== 1] \]
\ [F(N、M)= \ sum_ {D = 1} ^ ND ^ 2 \和^ {N / D} _ {i = 1} \和^ {M / D} _ {J = 1} \ sum_ {K | GCD(I、J)}ミュー(K)\ \]

Kは、先に列挙しました。

\ [F MU(K)\(N、M)= \ sum_ {D = 1} ^ ND ^ 2 \ sum_ {k = 1} ^ {N / D} \和^ {N /(D * K)} _ {i = 1} \和^ {M /(D * K)} _ {J = 1} \]

MU(K)\ {n}は左\ lfloor \ FRAC {\ \ [F(N、M)= \ sum_ {D = 1} ^ ND ^ 2 \ sum_ {k = 1} ^ {N / D} D * K} \右\ rfloor時間は左\ \ \ lfloor \ FRAC {M} {Dの*のK} \右\ rfloor \]

それは今ルーチン反転、私たちは聞かせている\(T = D * k個\ )

\ [F(N、M)= \ sum_ {T = 1} ^ nは左、\ \ lfloor \ FRAC {N}、{T} \右\ rfloor時間は左\ \ \ lfloor \ FRAC {M} {T} \右\ rfloor \ sum_ {D | T} D ^ 2 \回\ミュー(\ FRAC {T}、{D})\]

\(G(X)= X * X、μ(x)= MU \(X)\)

于是\(F(N、M)= \ sum_ {T = 1} ^ nは左、\ \ lfloor \ FRAC {N}、{T} \右\ rfloor時間は左\ \ \ lfloor \ FRAC {M} {T} \右\ rfloor \回(回ミュー(X)\ G(X))\)

私は、山の背が畳み込みの形態であり、見つかった畳み込みと2つの関数の積であるので、我々は、線形ふるいを使用することができ、ふるいを見る神拡張バージョンの怒りに

合計する探しています:

私たちは覚えて\([i]のプリム\)は、i番目の素数である、\(低[i]が\)私素因数分解の指数力最小の素因数、です\(F [X] \)\( G(X)\)ボリューム\(MU(X)\)、\ (MU [X] \)\(\ MU(X)\ )

リニア画面と同様に、我々は3例を議論しました:

\(ケース1:\)は \(私は\)素数である
私たちが直接出て数えることができます\(低[I] = I、\; \ F [I] =私はタイムズI \ - 1、\; \ MU [I]を。 = -1 \)

\(ケース2:私は%プリム[J] = 0 \を\!) この場合は、乗法の機能を満たすために定義されている、すなわち\(I、プリム[J] \) プライム、そう\(P =私は時間を\しますプリム[J] \)、私たちがしている\(低[P] =プリム [J]、\; \ミュー[P] = -mu [i]は、\; \ F [i]は= F [i]が\回F [プリム[J]] \ )

\(ケース3:私は%プリム[J]を\ == 0 \) 本製品は、性的機能の定義を満たしていないので、我々は我々だけで維持することを検討してください\(低[I] \を)

考慮すると([i]の低I / \を 、プリム[J] \) 互いに素では、我々は類推でき、\(ケース2 \)[[I /低(\ fは I]]、プリムF [[J ]] \)起動します\(F [P] \)それを?

仮定(A、B \)\:プライム、我々持っている\(F [A \タイムズB] = F [A] \ F・タイムズ[B] \)

したがって、我々は持っている:\(F [P] = F [I] \タイムズF [プリム[J] = F [I \ / \低[I]] \タイムズF [プリム[J] \タイムズ低[I] ] \)

定義により、\(I \ / \ローは、[I]は、\)がされていません\(プリム[J] \)除数、そう\(I /低[i]は 、\; \プリム[J] \低倍[I ] \)互いに素

私が持っている必要があります\(プリム[J] \)品質係数、および線形ふるいの性質上、\(プリム[j]を\)最低限の品質係数Iを持っている必要がありますので、我々はしているミュー[P] = 0(\します 、 \; \低[P] =低[I] \回プリム[J] \)

場合は\(低[I]は、<私は\) 立証\(低[I] \タイムズプリム[J] <=私は\)ので、我々は直接使用することができます\(F [P] = Fを [私は/ \低\します[I]]回\ F [低倍\プリム[J] [i]は] \)

場合\は(低[i]を== I \) もし、私が以前に確かに上映されていないことを証明\(低[I] =プリム[J] ^ k個\) そしてkは確かに素数である、そして我々は、指示することができますで:\(F [P] =(I *はプリム[J])^ 2 - I ^ 2 \)

\(PS:\)

同じではありません、記録する必要はありません。この質問は、神の怒りに根ざしている:書き込み後の問題への解決策を見つけるためにだけ見て([I] \低)\のために、\(ケース3 \)、\ [I]([P-] F = F \回プリム[J] ^ 2 \) へ

\(コード:\)

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define re register
il int read() {
    re int x = 0, f = 1; re char c = getchar();
    while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();
    return x * f;
}
#define rep(i, s, t) for(re int i = s; i <= t; ++ i)
#define mod 1000000007
#define maxn 20000007
il int Pow(int x) {return 1ll * x * x % mod;}
int cnt, prim[maxn], f[maxn], mu[maxn], low[maxn];
bool vis[maxn];
il void init() {
    f[1] = mu[1] = 1;
    rep(i, 2, 2e7) {
        if(!vis[i]) f[i] = Pow(i) - 1, mu[i] = -1, low[i] = i, prim[++ cnt] = i;
        for(re int j = 1; j <= cnt; ++ j) {
            if(i * prim[j] > 2e7) break;
            int p = i * prim[j];
            vis[p] = 1;
            if(i % prim[j] == 0) {
                low[p] = low[i] * prim[j];
                if(low[i] == i) f[p] = (Pow(1ll * i * prim[j] % mod) - Pow(i) + mod) % mod;
                else f[p] = 1ll * f[i / low[i]] * f[low[i] * prim[j]] % mod;
                break;
            }
            mu[p] = -mu[i], low[p] = prim[j], f[p] = 1ll * f[i] * f[prim[j]] % mod;
        }
    }
    rep(i, 1, 2e7) f[i] = (f[i - 1] + f[i]) % mod;
}
il int F(int n, int m) {
    if(n > m) swap(n, m);
    int ans = 0;
    for(re int l = 1, r; l <= n; l = r + 1) {
        r = min(n / (n / l), m / (m / l));
        ans = (ans + 1ll * (1ll * (n / l) * (m / l) % mod) * (f[r] - f[l - 1]) % mod) % mod;
    }
    return (ans + mod) % mod;
}
il int get(int n, int m, int p) {
    return ((1ll * p * F(n, m) % mod + 1ll * n * F(p, m) % mod) % mod + 1ll * m * F(n, p)) % mod;
}
il void outit() {
    for(re int i = 1, T = read(); i <= T; ++ i) printf("%d\n", get(read(), read(), read()));
}
int main() {
    init(), outit();
    return 0;
}

おすすめ

転載: www.cnblogs.com/bcoier/p/11618366.html