之前一位同学做了这个题并给我讲解过,后来我写这个题的时候一直出问题,样例过不去,经检查线性筛函数都没问题,应该是求f和g的部分有错误,但是我太弱了找不出来qwq哪位大佬可以来看看/kel
#include<bits/stdc++.h>
#define int long long
#define mod 1000000007
#define N 200005
using namespace std;
int n,m,k,p[N],vis[N],mu[N],s0[N],nums[N],cnt[N],qc[N],d[N],top;
//质数,合数标记,莫比乌斯函数,约数个数,最小质因子数,不同质因子数,去重后的数
int f[N][25],g[N][25];
void eu(){
mu[1]=1;
mu[1]=1;s0[1]=1;nums[1]=1;cnt[1]=1;qc[1]=1;
for(int i=2;i<=N;i++){
if(!vis[i]){
mu[i]=-1;
p[++top]=i;
s0[i]=2;
nums[i]=1;
cnt[i]=2;
qc[i]=i;
}
for(int j=1;j<=top&&i*p[j]<=N;j++){
int k=i*p[j];
vis[k]++;
if(!(i%p[j])){
mu[k]=0;
nums[k]=nums[i]+1;
s0[k]=s0[i]/(nums[i]+1)*(nums[k]+1);
cnt[k]=cnt[i];
qc[k]=qc[i];
break;
}
mu[k]=-mu[i];
cnt[k]=cnt[i]+1;
s0[k]=s0[i]*s0[j];
nums[k]=1;
qc[k]=qc[i]*p[j];
}
}
for(int i=1;i<=N;i++){
f[i][0]=1;g[i][0]=1;
f[i][1]=f[i-1][1]+s0[i];
g[i][1]=g[i-1][1]+mu[i];
}
}
int find(int now,int lst){
int num=cnt[now];
int res=0;
for(int l=1,r;l<=m;l=r+1){
r=min(m/(m/l),k/(k/l));
res+=(g[r][num]-g[l-1][num])*(f[m/l][num])*(f[k/l][num]);
res%=mod;
}
res*=d[now];res%=mod;
for(int i=lst;i<=top&&now*p[i]<=n;i++){
for(int l=1,r;l<=m;l=r+1){
r=min(m/(m/l),k/(k/l));
g[r][num+1]=g[r][num]+g[r/p[i]][num+1];
f[m/l][num+1]=f[m/l][num]-f[m/l/p[i]][num];
f[k/l][num+1]=f[k/l][num]-f[k/l/p[i]][num];
}
res+=find(now*p[i],i+1);
res%=mod;
}
return res;
}
int t,a,b,c;
signed main(){
ios::sync_with_stdio(false);
eu();
cin>>t;
while(t--){
cin>>a>>b>>c;
if(a>b)swap(a,b);
if(a>c)swap(a,c);
if(b>c)swap(b,c);
n=a;m=b;k=c;
for(int i=1;i<=n;i++)d[i]=0;
for(int i=1;i<=n;i++)d[qc[i]]+=n/i;
cout<<find(1,1)<<endl;
}
}
signed main(){
ios::sync_with_stdio(false);
eu();
cin>>t;
while(t--){
cin>>a>>b>>c;
if(a>b)swap(a,b);
if(a>c)swap(a,c);
if(b>c)swap(b,c);
n=a;m=b;k=c;
for(int i=1;i<=n;i++)d[i]=0;
for(int i=1;i<=n;i++)d[qc[i]]+=n/i;
cout<<find(1,1)<<endl;
}
}