求助,样例过不去
查看原帖
求助,样例过不去
555617
Targanzqq楼主2024/6/28 19:18

之前一位同学做了这个题并给我讲解过,后来我写这个题的时候一直出问题,样例过不去,经检查线性筛函数都没问题,应该是求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;
	}
}
2024/6/28 19:18
加载中...