P14488
xujindong_ · · 题解
三重求和问题,同时反演三个
此时即使我们枚举了
枚举
因为
#include<bits/stdc++.h>
using namespace std;
int n,prime[100005],cnt;
unsigned long long ta[100005],tb[100005],tc[100005],td[100005],te[100005],tf[100005],a[100005],b[100005],c[100005],d[100005],e[100005],f[100005],t1[100005],t2[100005],ans;
bool vis[100005];
int prime_init(int n,int prime[],bool a[],int cnt=0){
for(int i=2;i<=n;i++)a[i]=1;
for(int i=2;i<=n;i++){
if(a[i])prime[++cnt]=i;
for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
a[i*prime[j]]=0;
if(i%prime[j]==0)break;
}
}
return cnt;
}
void solve(int m){
for(int i=1;i<=cnt&&prime[i]<=m;i++)for(int j=m/prime[i];j>=1;j--)d[prime[i]*j]-=d[j];
for(int u=1;u*u<=m;u++){
for(int i=1;i<=m;i++)t1[i]=i%u?0:a[i],t2[i]=i%u?0:b[i];
for(int i=1;i<=cnt&&prime[i]<=m;i++)for(int j=m/prime[i];j>=1;j--)t1[j]+=t1[prime[i]*j],t2[j]+=t2[prime[i]*j];
for(int i=1;i<=m;i++)t1[i]*=d[i],t2[i]*=d[i];
for(int i=1;i<=cnt&&prime[i]<=m;i++)for(int j=1;j<=m/prime[i];j++)t1[prime[i]*j]+=t1[j],t2[prime[i]*j]+=t2[j];
for(int i=1;i<=m;i++)t1[i]*=b[i],t2[i]*=a[i];
for(int i=1;i<=cnt&&prime[i]<=m;i++)for(int j=m/prime[i];j>=1;j--)t1[j]+=t1[prime[i]*j],t2[j]+=t2[prime[i]*j];
for(int v=u+1;u*v<=m;v++)if(__gcd(u,v)==1)ans+=e[u]*f[v]*c[u*v]*t1[v]+e[v]*f[u]*c[u*v]*t2[v];
}
for(int i=1;i<=cnt&&prime[i]<=m;i++)for(int j=m/prime[i];j>=1;j--)a[j]+=a[prime[i]*j],b[j]+=b[prime[i]*j];
for(int i=1;i<=m;i++)ans+=e[1]*f[1]*c[1]*d[i]*a[i]*b[i];
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cin>>n,cnt=prime_init(n,prime,vis);
for(int i=1;i<=n;i++)cin>>ta[i];
for(int i=1;i<=n;i++)cin>>tb[i];
for(int i=1;i<=n;i++)cin>>tc[i];
for(int i=1;i<=n;i++)cin>>td[i];
for(int i=1;i<=n;i++)cin>>te[i];
for(int i=1;i<=n;i++)cin>>tf[i];
for(int i=1;i<=cnt;i++)for(int j=n/prime[i];j>=1;j--)te[prime[i]*j]-=te[j],tf[prime[i]*j]-=tf[j];
for(int i=1;i<=cnt;i++)for(int j=n/prime[i];j>=1;j--)tc[j]+=tc[prime[i]*j];
for(int i=1;i<=n;i++){
for(int j=1;j<=n/i;j++)a[j]=ta[i*j],b[j]=tb[i*j],c[j]=tc[i*j],d[j]=td[i*j],e[j]=te[i*j],f[j]=tf[i*j];
solve(n/i);
}
return cout<<ans<<'\n',0;
}