[hdu6588]Function

Order $ 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) $
consider a prefix of the formula and, i.e.
   $ \ sum_ {i = 1} ^ {n} gcd (m, i ) $ (formula m and unrelated n and previous)
= $ \ 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 | n-m} / T \ CDOT \ varphi (T) $
of $ \ varphi $ linear sieve, the latter half of the original formula can be used o (m), consider first half
= $ \ sum_ {i = 1 } ^ {m} \ sum_ {T | i} \ varphi (T) \ cdot (((i + 1) ^ {3} -1) / T- (i ^ 3 -1) / T) $
= $ \ sum_. 1 = {T m} ^ {} \ varphi (T) \ sum_ {I ^ = {m}. 1 / T} ((+ iT. 1) ^ {-1}. 3 ) / T-(iT ^ 3-1) / T $
= $ \ sum_. 1 = {T m} ^ {} \ varphi (T) \ sum_ {I}. 1 ^ = {m / 3Ti T} ^ {2} + 3i + 1 $
this can also be o (m) are calculated (the latter may be pretreated sigma, the formula can be set), i.e., the total time complexity of 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

 

Guess you like

Origin www.cnblogs.com/PYWBKTDA/p/11259030.html