[HAOI2011]Problem b

 出处:http://www.cnblogs.com/peng-ym/p/8673239.html

#include<bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define rep(i,j,k) for(int i=j;i<=k;i++)
#define dep(i,j,k) for(int i=k;i>=j;i--)
#define INF 0x3f3f3f3f
#define mem(i,j) memset(i,j,sizeof(i))
#define make(i,j) make_pair(i,j)
#define pb push_back
using namespace std;
const int N=5e4+5;
int sum[N],pre[N],mu[N],tot,k;
bool vis[N];
void init() {
    mu[1]=1;
    rep(i,2,N-5) {
        if(!vis[i]) { pre[++tot]=i; mu[i]=-1; }
        for(int j=1;j<=tot&&pre[j]*i<=N-5;j++) {
            vis[i*pre[j]]=1;
            if(i%pre[j]==0) break;
            mu[i*pre[j]]=-mu[i];
        }
    }
    rep(i,1,N-5) sum[i]=sum[i-1]+mu[i];
}
LL cal(int n,int m) {
    LL ans=0;
    int up=min(n/k,m/k);
    for(int l=1,r;l<=up;l=r+1) {
        r=min((n/k)/((n/k)/l),(m/k)/((m/k)/l));
        ans+=(1LL*n/(1LL*l*k))*(1LL*m/(1LL*l*k))*(sum[r]-sum[l-1]);
    }
    return ans;
}
int main() {
    init();
    int t,a,b,c,d;
    scanf("%d",&t);
    while(t--) {
        scanf("%d %d %d %d %d",&a,&b,&c,&d,&k);
        printf("%lld
",cal(b,d)-cal(b,c-1)-cal(a-1,d)+cal(a-1,c-1));
    }
    return 0;
}
View Code
一步一步,永不停息
原文地址:https://www.cnblogs.com/Willems/p/10917639.html