[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 }