以上の6588の学校--2019hduオイラー機能+反転

\ [iが[J ^ 3、(J + 1)^ 3 \ため([3]私は、私の\ SQRT)\\最初の変換式で、検討の\ sum_ {i = 1} ^ {N}を探し-1]、\のSQRT [3] iがjは\\私は[J ^ 3、(J + 1)^ 3-1]間隔(i、j)の総和で\、全てのjを列挙することができます= \\ \ sum_ {i = 1} ^ {N}(\ SQRT [3] I、I)= \ sum_ {iは= {\ lfloor \ SQRT [3:我々は、次に、N二つの部分、和に分割されていることができます】N \ rfloor} ^ 3} ^ {N}(\のSQRT [3] N、N)+ \ sum_ {J = 1} ^ {\のSQRT [3] N-1} \ sum_ {I = J ^ 3} ^ {(J + 1)^ 3-1}(i、j)は\\ \]

\ [フロント最初に形成された\ sum_の図{I = {\ lfloor \ SQRT [3] N \のrfloor} ^ 3} ^ {N}(\のSQRT [3] N、I)、式オイラーの直接交換を\ \元の数式= \ sum_ {I = {\ lfloor \ SQRT [3] N \ rfloor} ^ 3} ^ {N} \ \ sum_ {D | I、D | {\ lfloor \ SQRT [3] N \ rfloor} } \ varphi(D)= \ sum_ {D | {\ lfloor \ SQRT [3] N \ rfloor}} \ varphi(D)\大きな(N / D - (\ lfloor \ SQRT [3] N \ rfloor-1 )/ D \大きい)\\ {\ lfloor \ SQRT [3] N \ rfloor}因子が少ない、のみ\ SQRT [6] N、そうも複雑である\]

\ [我々は逆で形質転換することができ、裏面の外観に合わせて迅速に\\ \ sum_ {J = 1} ^加算後{\のSQRTを[3] N-1} \ sum_ {I = J ^ 3} ^ {(J + 1)^ 3-1}(I、J)= \ sum_ {J = 1} ^ {\のSQRT [3] N-1} \ Biggの(\ sum_ {i = 1} ^ {(J +1)^ 3-1}(i、j)は - \ sum_ {i = 1} ^ {J ^ 3-1}(i、j)は\ Biggの)\\今シークの\ sum_ {J = 1} ^ {\のSQRT [3] N-1} \ sum_ {i = 1} ^ {F(j)を}(i、j)は、実際に、それは(i、j)とすることができる展開し、代わりの一次オイラー角を考慮しない\\タイプ= \ sum_ {J = 1} ^ {\のSQRT [3] N-1} \ sum_ {i = 1} ^ {F(J)} \ sum_ {D | I、D | J} \ varphi(D) = \ sum_ {J = 1} ^ {\のSQRT [3] N-1} \ sum_ {D | J} \ varphi(D)\ FRAC {F(J)}、{D} \\なお、私の上限以来そしてjが関連しているので、あなただけのフロントD Iに切り替えることができ列挙の順序を切り替えたとき、Jは、そうでなければ、正しいの\ varphi(D)元の型\\の発生回数= \ sum_ {J = 1を得ることは不可能である、正面に切り替えることはできません} ^ {\のSQRT [3] N-1} \ sum_ {D | J} \ varphi(D)\ Biggの(\ lfloor \ FRAC {(J + 1)^ 3-1}、{D} \ rfloor- \ lfloor式Dの\ FRAC {J ^ 3-1}、{D} \ rfloor \ Biggの)\明らかJ = KD、それかもしれない外側の一次列挙\\ = \ sum_ {D = 1} ^ {N = \のSQRT [ 3] N-1} \ varphi(D)\ sum_ {k = 1} ^ {\ FRAC {N}、{D}}(3K ^ 2D + 3K + 1)= \ sum_ {D = 1} ^ {N = \ SQRT [3] N-1} \ varphi(D)(3次元の\ sum_ {k = 1} ^ {\ FRAC {N}、{D}} K ^ 2 + 3 \ sum_ {k = 1} ^ {\ FRAC {N} {D} } K +、\ FRAC {N} {D})\\この点、我々は、接頭辞及びK ^ 2 k個の\ varphi(i)の値[1,1e7]の範囲を前処理することができる、及びO(1とすることができます)]それぞれのD \のために評価されます

#include <bits/stdc++.h>
const int N=1e7,XN=N+11,P=998244353;
int Add(int x,int const &y) {return (x+=y)>=P?x-P:x;}
int Minus(int x,int const &y) {return (x-=y)<0?x+P:x;}
int Mul(long long x,int const &y) {return x*y%P;}
int prime[XN],phi[XN],pcnt;
void Prep() {
    static bool notPrime[XN];
    phi[1]=1;
    for(int i=2;i<=N;++i) {
        if(!notPrime[i]) {
            prime[++pcnt]=i;
            phi[i]=i-1;
        }
        for(int j=1;j<=pcnt && i*prime[j]<=N;++j) {
            notPrime[i*prime[j]]=1;
            if(i%prime[j]==0) {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            } else
                phi[i*prime[j]]=phi[i]*phi[prime[j]];
        }
    }
}

int Sum1(long long x) {return x*(x+1)/2%P;}
int Sum2(long long x) {return (x*(x+1))%(6ll*P)*(2*x+1)/6%P;}
int Calc(int a,__int128 L,__int128 R) {
    int res=0;
    for(int d=1;1LL*d*d<=a;++d)
        if(a%d==0) {
            res=Add(res,Mul((R/d-L/d)%P,phi[d]));
            if(a!=d*d)
                res=Add(res,Mul((R/(a/d)-L/(a/d))%P,phi[a/d]));
        }
    return res;
}

int main() {
    Prep();int T;fin>>T;
    while(T--) {
        __int128 n;fin>>n;
        if(n<=7) {fout<<n<<'\n';} 
        else {
            int r;for(r=1;(__int128)(r+2)*(r+2)*(r+2)-1<=n;++r);
            int Ans=Calc(r+1,(__int128)(r+1)*(r+1)*(r+1)-1,n);
            for(int T=1;T<=r;++T)
                Ans=Add(Ans,Mul(phi[T],Add(Add(Mul(3*T,Sum2(r/T)),Mul(3,Sum1(r/T))),r/T)));
            fout<<Ans<<'\n';
        }
    }
}

おすすめ

転載: www.cnblogs.com/zsben991126/p/11365423.html