70pts卡常求助
查看原帖
70pts卡常求助
555617
Targanzqq楼主2024/6/29 00:02

rt,复杂度没问题,但是后三个点一直过不去

#include<bits/stdc++.h>
#define int long long
#define mod 1000000007ll
#define N 100000
using namespace std;

int n,m,k,p[N+5],vis[N+5],mu[N+5],s0[N+5],nums[N+5],cnt[N+5],qc[N+5],d[N+5],top;
//质数,合数标记,莫比乌斯函数,约数个数,最小质因子数,不同质因子数,去重后的数 
int f[N+5][25],g[N+5][25],ans;
int test;

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]==0){
				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[p[j]];
			nums[k]=1; 
			qc[k]=qc[i]*p[j];
		}
	}
	for(int i=1;i<=N;i++){
		f[i][1]=f[i-1][1]+s0[i];
		g[i][1]=g[i-1][1]+mu[i];
	}
}

void 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=(res+(g[r][num]-g[l-1][num])*f[m/l][num]*f[k/l][num]+mod)%mod;
	}
	ans=(ans+res*d[now])%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];
    	}
    	find(now*p[i],i+1);
	}
}

int t;

signed main(){
	//freopen("aaa.in","r",stdin);
	ios::sync_with_stdio(false);
	eu();
	cin>>t;
	while(t--){
		ans=0;
		cin>>n>>m>>k;
		if(n>m)swap(n,m);
		if(n>k)swap(n,k);
		if(m>k)swap(m,k);
		for(int i=1;i<=n;i++)d[i]=0;
		for(int i=1;i<=n;i++)d[qc[i]]+=n/i;
		find(1,1);
		cout<<ans<<"\n";
	}
}
2024/6/29 00:02
加载中...