和P3455tm神似,加了一个容斥原理统计答案
ans=sqr(b,d,k)-sqr(b,c-1)-sqr(a-1,d)+sqr(a-1,c-1);
其他应该没啥需要注意的了吧,证明见P3455那篇博客
代码
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 50007;
const int maxm = 50000;
ll sum[maxn],tot,prime[maxn],u[maxn];
int vis[maxn];
void fir()
{
u[1]=1;
for(int i=2;i<=maxm;i++)
{
if(!vis[i])
{
prime[++tot]=i;
u[i]=-1;
}
for(int j=1;j<=tot&&i*prime[j]<=maxm;j++)
{
vis[prime[j]*i]=1;
if(i%prime[j]==0)break;
u[prime[j]*i]=-u[i];
}
}
for(int i=1;i<=maxm;i++)sum[i]=sum[i-1]+u[i];
}
ll sqr(ll a,ll b,ll d)
{
ll ans=0;
a/=d,b/=d;
for(ll l=1,r;l<=min(a,b);l=r+1)
{
r=min(a/(a/l),b/(b/l));
ans+=(sum[r]-sum[l-1])*(a/l)*(b/l);
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
fir();
while(T--)
{
ll x,y,z,l,d;
scanf("%lld%lld%lld%lld%lld",&x,&y,&z,&l,&d);
printf("%lld\n",sqr(y,l,d)-sqr(y,z-1,d)-sqr(x-1,l,d)+sqr(x-1,z-1,d));
}
}