求:
根据容斥原理,可以分为四部分来求,每一部分都可以拆成:

考虑到可以转化,所以为了化简式子,可以:原式

式子出现莫比乌斯函数后,通常可以考虑交换求和顺序,枚举,即:

很显然,只要预处理莫比乌斯函数,然后用数论分块求解式子。

Code:

#include<bits/stdc++.h>
using namespace std;
const int maxn=5e4+7;
int mu[maxn + 1],sum[maxn+1];
int work(int n,int m) {
    int tot=min(n,m);
    int x,y,r,ans=(0);
    for(int i=1;i<=tot;++i) {
        x=n/i,y=m/i;
        r=min(n/x,m/y);
        ans+=(sum[r]-sum[i-1])*x*y;
        i=r;
    }
    return ans;
}
signed main() {
    cin.sync_with_stdio(false), cin.tie(nullptr),cout.tie(nullptr);
    mu[1] = 1;
    for (int i = 1; i <= maxn; i++) {
        for (int j = 2 * i; j <= maxn; j += i) {
            mu[j] -= mu[i];
        }
        sum[i]=sum[i-1]+mu[i];
    }
    int T,a,b,c,d,k;
    cin>>T;
    while(T--) {
        cin>>a>>b>>c>>d>>k;
        cout<<work(b/k,d/k)-work((a-1)/k,d/k)-work(b/k,(c-1)/k)+work((a-1)/k,(c-1)/k)<<'\n'; 
    }
    return 0;
}