您的位置:首页 > 其它

【bzoj 2301】Problem b(莫比乌斯反演)

2017-12-09 00:22 260 查看
传送门biu~

#include<bits/stdc++.h>
using namespace std;
int u[100005],prime[100005],tp;
bool b[100005];
void get_u(){
u[1]=1;
for(int i=2;i<=100000;++i){
if(!b[i])   prime[++tp]=i,u[i]=-1;
for(int j=1;j<=tp && i*prime[j]<=100000;++j){
b[i*prime[j]]=true;
if(i%prime[j]==0)   break;
u[i*prime[j]]=-u[i];
}
}
for(int i=1;i<=100000;++i)  u[i]+=u[i-1];
}
long long calc(int n,int m,int k){
n/=k;   m/=k;
int pre;
long long re=0;
for(int i=1;i<=n && i<=m;i=pre+1){
pre=min(n/(n/i),m/(m/i));
re+=1ll*(n/i)*(m/i)*(u[pre]-u[i-1]);
}
return re;
}
int main(){
int n;
scanf("%d",&n);
get_u();
while(n--){
int a,b,c,d,k;
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
printf("%lld\n",calc(b,d,k)+calc(a-1,c-1,k)-calc(a-1,d,k)-calc(b,c-1,k));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: