1. 程式人生 > >luogu P2522 [HAOI2011]Problem b

luogu P2522 [HAOI2011]Problem b

背景:

以下圖片均來自我的 P D F PDF 檔案,謝絕轉載。

題目傳送門:

https://www.luogu.org/problemnew/show/P2522

題意:

在這裡插入圖片描述

思路:

在這裡插入圖片描述
在這裡插入圖片描述

程式碼:

#include<cstdio>
#include
<cstring>
#include<algorithm> #define LL long long #define _ (int)5e4+10 using namespace std; int mu[_],prime[_]; bool bz[_]; int t=0; LL sum[_]; void init(int ma) { mu[1]=sum[1]=1; bz[0]=bz[1]=true; for(int i=2;i<=ma;i++) { if(!bz[i]) prime[++t]=i,mu[i]=-1; for(int j=1;j<=
t&&(LL)i*prime[j]<=ma;j++) { bz[i*prime[j]]=true; if(!(i%prime[j])) { mu[i*prime[j]]=0; break; } mu[i*prime[j]]=-mu[i]; } sum[i]=sum[i-1]+mu[i]; } } LL calc(int n,int m,int k) { int l=1,r; LL tot=0; n/=k,m/=k; while(l<=min(n,m)) { r=min(n/(n/l),m/(m/l)); tot+
=(LL)(n/l)*(LL)(m/l)*(LL)(sum[r]-sum[l-1]); l=r+1; } return tot; } int main() { int T,x1,y1,x2,y2,k; init(_); scanf("%d",&T); while(T--) { scanf("%d %d %d %d %d",&x1,&y1,&x2,&y2,&k); printf("%lld\n",calc(y1,y2,k)-calc(y1,x2-1,k)-calc(x1-1,y2,k)+calc(x1-1,x2-1,k)); } }