20pts 求调
查看原帖
20pts 求调
464732
luqyou楼主2024/7/26 20:21
#include<bits/stdc++.h>
#define int long long
#define fi first
#define sc second
#define pii pair<int,int>
#define pb push_back
using namespace std;
const int maxn=1e5+10;
int n,m,k,p[maxn],mu[maxn],cnt,vis[maxn],sum[maxn];
void pre(){
	mu[1]=1;
	for(int i=2;i<=1e5;i++){
		if(!vis[i]) p[++cnt]=i,mu[i]=-1;
		for(int j=1;j<=cnt&&i*p[j]<=1e5;i++){
			vis[i*p[j]]=1;
			if(i%p[j]==0){
				mu[i*p[j]]=0;
				break;
			}
			mu[i*p[j]]=-mu[i];
		}
	}
	for(int i=1;i<=1e5;i++) sum[i]=sum[i-1]+mu[i];
}
void solve(){
	cin>>n>>m>>k;
	n/=k,m/=k;
	int res=0,now=1;
	//Σ1 <= i <= n (n/ki)*(m/ki)*mu(i) 
	while(now<=min(n,m)){
		int r=min(n/(n/now),m/(m/now));
		res+=(sum[r]-sum[now-1])*(n/now)*(m/now),now=r+1;
	}
	cout<<res<<endl;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int t=1;
    cin>>t,pre();
    while(t--) solve();
    return 0;
}

2024/7/26 20:21
加载中...