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
  • 相关阅读:
    POJ 3126 Prime Path
    POJ 2429 GCD & LCM Inverse
    POJ 2395 Out of Hay
    【Codeforces 105D】 Bag of mice
    【POJ 3071】 Football
    【POJ 2096】 Collecting Bugs
    【CQOI 2009】 余数之和
    【Codeforces 258E】 Devu and Flowers
    【SDOI 2010】 古代猪文
    【BZOJ 2982】 combination
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/11259030.html
Copyright © 2011-2022 走看看