[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

猜你喜欢

转载自www.cnblogs.com/PYWBKTDA/p/11259030.html