problem
analysis
反演例题
由容斥可得, ans=ans(b,d)−ans(a−1,d)−ans(b,c−1)+ans(a−1,c−1) a n s = a n s ( b , d ) − a n s ( a − 1 , d ) − a n s ( b , c − 1 ) + a n s ( a − 1 , c − 1 )
单分块还不会?
于是每一个分块都是 O(n−−√+m−−√) O ( n + m ) 的时间,总 O(n(n−−√+m−−√)) O ( n ( n + m ) ) 时间复杂度
code
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 10000001
using namespace std;
bool bz[MAXN];
int p[MAXN],phi[MAXN],mu[MAXN],pre[MAXN];
int n,a,b,c,d,k,tot;
int read()
{
int x=0,f=1;
char ch=getchar();
while (ch<'0' || '9'<ch)
{
if (ch=='-')f=-1;
ch=getchar();
}
while ('0'<=ch && ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
void init()
{
memset(bz,1,sizeof(bz));
mu[1]=phi[1]=1,tot=0;
for (int i=2;i<MAXN;i++)
{
if (bz[i])p[tot++]=i,phi[i]=i-1,mu[i]=-1;
for (int j=0;j<tot && i*p[j]<=MAXN;j++)
{
bz[i*p[j]]=0;
if (i%p[j]==0)
{
mu[i*p[j]]=0;
phi[i*p[j]]=phi[i]*p[j];
break;
}
mu[i*p[j]]=-mu[i],phi[i*p[j]]=phi[i]*(p[j]-1);
}
}
for (int i=1;i<MAXN;i++)pre[i]=pre[i-1]+mu[i];
}
int get(int n,int m,int d)
{
if (n>m)swap(n,m);
int ans=0;
n/=d,m/=d;
for (int i=1,last=1;i<=n;i=last+1)
{
last=min(n/(n/i),m/(m/i));
ans+=(pre[last]-pre[i-1])*(n/i)*(m/i);
}
return ans;
}
int main()
{
//freopen("readin.txt","r",stdin);
init();
n=read();
while (n--)
{
a=read(),b=read(),c=read(),d=read(),k=read();
printf("%d\n",get(b,d,k)-get(a-1,d,k)-get(b,c-1,k)+get(a-1,c-1,k));
}
return 0;
}