ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[hdu7200]Yet Another Easy Function Sum Problem

2022-08-08 19:32:53  阅读:216  来源: 互联网

标签:Function lfloor frac int Sum rfloor Another sum mod


对原式反演,问题即求$\sum_{d=1}^{n}\mu(d)\left(\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}H(id)\right)^{2}$

设置阈值$B$,并对$d$和$B$的大小关系分类讨论——

第一部分

对于$d\le B$,记$F_{1}(m,t)=\sum_{i=1}^{m}H(it)$,则原式即$\sum_{d=1}^{B}\mu(d)F_{1}^{2}(\lfloor\frac{n}{d}\rfloor,d)$

关于$F_{1}(m,t)$,代入$H(it)=\frac{H(i)H(t)}{H(\gcd(i,t))}$,并枚举$d=\gcd(i,t)$后反演,即
$$
F_{1}(m,t)=H(t)\sum_{d\mid t}\frac{1}{H(d)}\sum_{g\mid \frac{t}{d}}\mu(g)F_{1}(\lfloor\frac{m}{dg}\rfloor,dg)=H(t)\sum_{T\mid t}\left(\sum_{d\mid T}\frac{\mu(\frac{T}{d})}{H(d)}\right)F_{1}(\lfloor\frac{m}{T}\rfloor,T)
$$
记中间项为$H'(T)$(即$\mu *\frac{1}{H}$),可以$o(B\log n)$预处理出

枚举$d$并记忆化搜索$F_{1}(\lfloor\frac{n}{d}\rfloor,d)$,边界条件为$m=0$或$t=1$,后者用${\rm Min}25$筛$o(\frac{n^{\frac{3}{4}}}{\log n})$预处理出

关于复杂度,将其按初始状态和转移状态分类讨论:

1.关于初始状态,状态数为$o(B)$,转移数为$\sum_{d=1}^{B}\sigma(d)=o(B\log n)$

2.关于转移状态,均形如$(\lfloor\frac{n}{d^{2}x}\rfloor,d)$(其中$d\le B$),状态数为$\sum_{d=1}^{B}\frac{\sqrt{n}}{d}=o(\sqrt{n}\log n)$,转移数为
$$
\sum_{d=1}^{B}\frac{\sqrt{n}\sigma(d)}{d}=\sqrt{n}\sum_{i=1}^{B}\frac{1}{i}\sum_{d=1}^{\lfloor\frac{B}{i}\rfloor}\frac{1}{d}=\sqrt{n}\log^{2}n
$$

第二部分

对于$d>B$,记$F_{2}(m,i,j)=\sum_{d=1}^{m}\mu(d)H(id)H(jd)$,则原式即
$$
\sum_{i=1}^{\lfloor\frac{n}{B}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{B}\rfloor}\left(F_{2}(\lfloor\frac{n}{\max(i,j)}\rfloor,i,j)-F_{2}(B,i,j)\right)
$$
关于$F_{2}(m,i,j)$,类似$F_{1}$的处理方式,即
$$
F_{2}(m,i,j)=H(i)H(j)\sum_{T_{1}\mid i}H'(T_{1})\sum_{T_{2}\mid i}H'(T_{2})\sum_{d=1}^{\lfloor\frac{m}{T}\rfloor}\mu(dT)H^{2}(dT)
$$
(其中$T={\rm lcm}(T_{1},T_{2})$)

记最后一项为$G(\lfloor\frac{m}{T}\rfloor,T)$,注意到$\mu(dT)\ne 0\Longrightarrow \gcd(d,T)=1$,即
$$
G(m,t)=\mu(t)H^{2}(t)\sum_{g\mid t}\mu(g)G(\lfloor\frac{m}{g}\rfloor,g)
$$
枚举$i,j,T_{1}$和$T_{2}$并记忆化搜索$G(\lfloor\frac{m}{T}\rfloor,T)$,边界的处理与$F_{1}$相同

关于复杂度,同样按初始状态和转移状态分类,后者的分析也与$F_{1}$相同

关于初始状态,不妨将$\max(i,j)$改为$i$,状态数为$\sum_{T_{1}=1}^{\lfloor\frac{n}{B}\rfloor}\sum_{T_{2}=1}^{\lfloor\frac{n}{B}\rfloor}\sqrt{\frac{n}{T_{1}^{2}T_{2}}}=\frac{n\log n}{\sqrt{B}}$,转移数为
$$
\sum_{T_{1}=1}^{\lfloor\frac{n}{B}\rfloor}\sum_{T_{2}=1}^{\lfloor\frac{n}{B}\rfloor}\sqrt{\frac{n}{T_{1}^{2}T_{2}}}\sigma(T_{1})\sigma(T_{2})=
\sqrt{n}\sum_{d_{1}=1}^{\lfloor\frac{n}{B}\rfloor}\frac{1}{d_{1}}\sum_{d_{2}=1}^{\lfloor\frac{n}{B}\rfloor}\frac{1}{\sqrt{d_{2}}}\sum_{T_{1}=1}^{\lfloor\frac{n}{Bd_{1}}\rfloor}\frac{1}{T_{1}}\sum_{T_{2}=1}^{\lfloor\frac{n}{Bd_{2}}\rfloor}\frac{1}{\sqrt{T_{2}}}=\frac{n\log^{3}n}{\sqrt{B}}
$$

 

取$B=n^{\frac{2}{3}}$,时间复杂度为$o(\frac{n^{\frac{3}{4}}}{\log n}+n^{\frac{2}{3}}\log^{3}n)$,空间复杂度为$o(n^{\frac{2}{3}}\log n)$

两者均略卡常,考虑以下两个优化:

1.仅搜索$F_{1}$和$G$的(第二维$t$)满足$\mu(t)\ne 0$的状态

2.在预处理约数时,仅考虑满足$\mu(t)\ne 0$的$t$的约数(前者优化后$G$的状态数仅$10^{6}$)

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define N 1100000
  4 #define mod 1000000007
  5 #define ll long long
  6 int n,t,K,B,ans,vis[N],p[N],mu[N],H[N],iH[N],HH[N],val[N],S[N],f1[N],g[N];
  7 ll P[N];vector<int>fac[N];unordered_map<int,int>F1[N],G[N];
  8 int sqr(int n){
  9     return (ll)n*n%mod;
 10 }
 11 void add(int &x,int y){
 12     x+=y;if (x>=mod)x-=mod;
 13 }
 14 int qpow(int n,int m){
 15     int s=n,ans=1;
 16     while (m){
 17         if (m&1)ans=(ll)ans*s%mod;
 18         s=sqr(s),m>>=1;
 19     }
 20     return ans;
 21 }
 22 int get_S1(int n){
 23     return (ll)n*(n+1)/2%mod;
 24 }
 25 int get_S2(int n){
 26     return (ll)n*(n+1)%mod*((n<<1)+1)%mod*(mod+1)/6%mod;
 27 }
 28 int get_id(int m){
 29     return (m<=K ? m : (K<<1)-n/m+1);
 30 } 
 31 void get_f1(){
 32     for(int i=1;i<=(K<<1);i++)S[i]=(get_S1(val[i])-1+mod)%mod;
 33     for(int i=1;p[i]<=K;i++)
 34         for(int j=(K<<1);(j)&&(P[i]<=val[j]);j--)
 35             S[j]=(S[j]-(ll)p[i]*(S[get_id(val[j]/p[i])]-S[p[i]-1]+mod)%mod+mod)%mod;
 36     for(int i=1;i<=(K<<1);i++)f1[i]=(S[i]-S[get_id((int)sqrt(val[i]))]+mod)%mod;
 37     for(int i=p[0];i;i--)
 38         for(int j=(K<<1);(j)&&(P[i]<=val[j]);j--){
 39             ll s=p[i];
 40             for(int e=1;s*p[i]<=val[j];e++,s*=p[i]){
 41                 int jj=get_id(val[j]/s);
 42                 f1[j]=(f1[j]+(ll)p[i]*((val[j]/s<P[i] ? (S[jj]-S[p[i]]+mod) : f1[jj])+1))%mod;
 43             }
 44             f1[j]=(f1[j]+p[i])%mod; 
 45         }
 46     for(int i=1;i<=(K<<1);i++)f1[i]=(f1[i]+1)%mod;
 47 }
 48 void get_g(){
 49     for(int i=1;i<=(K<<1);i++)S[i]=(get_S2(val[i])-1+mod)%mod;
 50     for(int i=1;p[i]<=K;i++)
 51         for(int j=(K<<1);(j)&&(P[i]<=val[j]);j--)
 52             S[j]=(S[j]-(ll)sqr(p[i])*(S[get_id(val[j]/p[i])]-S[p[i]-1]+mod)%mod+mod)%mod;
 53     for(int i=1;i<=(K<<1);i++)S[i]=(mod-S[i])%mod;
 54     for(int i=1;i<=(K<<1);i++)g[i]=(S[i]-S[get_id((int)sqrt(val[i]))]+mod)%mod;
 55     for(int i=p[0];i;i--)
 56         for(int j=(K<<1);(j)&&(P[i]<=val[j]);j--){
 57             int jj=get_id(val[j]/p[i]);
 58             g[j]=(g[j]+(ll)(mod-sqr(p[i]))*((val[j]/p[i]<P[i] ? (S[jj]-S[p[i]]+mod) : g[jj])+1))%mod;
 59         }
 60     for(int i=1;i<=(K<<1);i++)g[i]=(g[i]+1)%mod;
 61 }
 62 int get_F1(int m,int t){
 63     if (!m)return 0;
 64     if (t==1)return f1[get_id(m)];
 65     if (F1[t].find(m)!=F1[t].end())return F1[t][m];
 66     int ans=0;
 67     for(int i:fac[t])ans=(ans+(ll)HH[i]*get_F1(m/i,i))%mod;
 68     ans=(ll)ans*H[t]%mod;
 69     return F1[t][m]=ans;
 70 }
 71 int get_G(int m,int t){
 72     if (!m)return 0;
 73     if (t==1)return g[get_id(m)];
 74     if (G[t].find(m)!=G[t].end())return G[t][m];
 75     int ans=0;
 76     for(int i:fac[t]){
 77         int s=get_G(m/i,i);
 78         ans=(ans+(mu[i]>0 ? s : mod-s))%mod;
 79     } 
 80     ans=(ll)ans*sqr(H[t])%mod;
 81     if (mu[t]<0)ans=(mod-ans)%mod;
 82     return G[t][m]=ans;
 83 }
 84 int main(){
 85     mu[1]=H[1]=iH[1]=1;
 86     for(int i=2;i<N;i++){
 87         if (!vis[i]){
 88             p[++p[0]]=i,P[p[0]]=(ll)i*i,mu[i]=-1;
 89             H[i]=i,iH[i]=qpow(i,mod-2);
 90         }
 91         for(int j=1;(j<=p[0])&&(i*p[j]<N);j++){
 92             vis[i*p[j]]=1;
 93             if (i%p[j]){
 94                 mu[i*p[j]]=-mu[i];
 95                 H[i*p[j]]=H[i]*p[j],iH[i*p[j]]=(ll)iH[i]*iH[p[j]]%mod;
 96             }
 97             else{
 98                 mu[i*p[j]]=0;
 99                 H[i*p[j]]=H[i],iH[i*p[j]]=iH[i];
100                 break;
101             }
102         }
103     }
104     for(int i=1;i<N;i++)
105         for(int j=i;j<N;j+=i){
106             if (mu[j])fac[j].push_back(i);
107             if (mu[j/i])HH[j]=(HH[j]+(mu[j/i]>0 ? iH[i] : mod-iH[i]))%mod;
108         }
109     scanf("%d",&t);
110     while (t--){
111         scanf("%d",&n);
112         K=(int)sqrt(n),B=n/(int)pow(n,1.0/3),ans=0;
113         for(int i=1;i<=K;i++)val[i]=i,val[i+K]=n/(K-i+1);
114         get_f1(),get_g();
115         for(int i=1;i<=B;i++)
116             if (mu[i]){
117                 int s=sqr(get_F1(n/i,i));
118                 ans=(ans+(mu[i]>0 ? s : mod-s))%mod;
119             }
120         int n0=n/B;
121         for(int T1=1;T1<=n0;T1++)
122             for(int T2=1;T2<=n0;T2++){
123                 int T=T1*T2/__gcd(T1,T2);
124                 if (!mu[T])continue;
125                 for(int i=T1;i<=n0;i+=T1)
126                     for(int j=T2;j<=n0;j+=T2)
127                         ans=(ans+(ll)H[i]*H[j]%mod*HH[T1]%mod*HH[T2]%mod*(get_G(n/max(i,j)/T,T)-get_G(B/T,T)+mod))%mod;
128             }
129         printf("%d\n",ans);
130     }
131     return 0;
132 }
View Code

 

标签:Function,lfloor,frac,int,Sum,rfloor,Another,sum,mod
来源: https://www.cnblogs.com/PYWBKTDA/p/16563149.html

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有