zoukankan      html  css  js  c++  java
  • [hdu6588]Function

    令$m=\lfloor \sqrt[3]{n} \rfloor-1$ 
       $\sum_{i=1}^{n}gcd(floor(\sqrt[3]{i}),i)$
    =$\sum_{i=1}^{m}\sum\limits_{j=i^{3}}^{(i+1)^{3}-1}gcd(i,j)+\sum\limits_{i=(m+1)^{3}}^{n}gcd(m+1,i)$
    考虑该式的前缀和,即
       $\sum_{i=1}^{n}gcd(m,i)$(上式的m和n和之前的无关系)
    =$\sum_{d|m}d\sum_{i=1}^{n/d}\varepsilon(gcd(i,m/d))$
    =$\sum_{t|m}\mu(t)\sum_{dt|m}n/dt\cdot d$
    =$\sum_{T|m}n/T \sum_{d|T}d\cdot \mu(T/d)$
    =$\sum_{T|m}n/T\cdot \varphi(T)$
    对$\varphi$线性筛,原式后半部分可以用o(m),考虑前半部分
    =$\sum_{i=1}^{m}\sum_{T|i}\varphi(T)\cdot (((i+1)^{3}-1)/T-(i^3-1)/T)$
    =$\sum_{T=1}^{m}\varphi(T)\sum_{i=1}^{m/T}((iT+1)^{3}-1)/T-(iT^3-1)/T$
    =$\sum_{T=1}^{m}\varphi(T)\sum_{i=1}^{m/T}3Ti^{2}+3i+1$
    这个就也可以o(m)计算了(后面的sigma可以预处理,也可以套公式),总时间复杂度即o(m)

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define N 10000005
     4 #define mod 998244353
     5 #define ll __int128
     6 int T,m,ans,s1[N],s2[N],vis[N],phi[N],p[N];
     7 char s[101];
     8 int main(){
     9     s1[1]=3;
    10     s2[1]=4;
    11     phi[1]=1;
    12     for(int i=2;i<N-4;i++){
    13         s1[i]=(s1[i-1]+3LL*i*i)%mod;
    14         s2[i]=(s2[i-1]+3LL*i+1)%mod;
    15         if (!vis[i]){
    16             p[++p[0]]=i;
    17             phi[i]=i-1;
    18         }
    19         for(int j=1;(j<=p[0])&&(i*p[j]<N-4);j++){
    20             vis[i*p[j]]=1;
    21             if (i%p[j])phi[i*p[j]]=phi[i]*(p[j]-1); 
    22             else{
    23                 phi[i*p[j]]=phi[i]*p[j];
    24                 break;
    25             }
    26         }
    27     }
    28     scanf("%d",&T);
    29     while (T--){
    30         scanf("%s",s);
    31         ll n=0;
    32         for(int i=0;s[i];i++)n=n*10+(s[i]-'0');
    33         for(m=1;(ll)m*m*m<=n;m++);
    34         m-=2;
    35         int ans=0;
    36         for(int i=1;i<=m+1;i++)
    37             if ((m+1)%i==0)ans=(ans+(n/i-((ll)(m+1)*(m+1)*(m+1)-1)/i)%mod*phi[i])%mod;
    38         for(int i=1;i<=m;i++)ans=(ans+1LL*phi[i]*(1LL*i*s1[m/i]+s2[m/i]+mod))%mod;
    39         printf("%d\n",ans);
    40     }
    41 }
    View Code
  • 相关阅读:
    雨天的尾巴「线段树合并+树上差分」
    硬币购物「容斥+背包」
    消失之物「分治+背包」
    最小距离「多源最短路」
    任务分配「最短路+DP」
    LCA「树链剖分+线段树」
    组合计数基础
    SPOJ-QTREE4 Query on a tree IV
    K-D tree 区域查询复杂度证明
    bitset 求解高维偏序
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/11259030.html
Copyright © 2011-2022 走看看