bzoj2301: [HAOI2011]Problem b 莫比乌斯反演

来源:互联网 发布:程序员的电脑配置 编辑:程序博客网 时间:2024/05/16 06:38

裸的反演+一个区间的容斥

#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>#include <cstring>using namespace std;#define maxn 50100bool vis[maxn];int sum[maxn],mu[maxn],prim[maxn],tot;void init(){    mu[1]=1;    for(int i=2;i<=50000;i++)    {        if(!vis[i])        {            tot++;prim[tot]=i;mu[i]=-1;        }        for(int j=1;j<=tot&&prim[j]*i<=50000;j++)        {            vis[i*prim[j]]=1;            if(i%prim[j]==0)            {                mu[prim[j]*i]=0;                break;            }            else            {                mu[i*prim[j]]=-mu[i];            }        }    }    for(int i=1;i<=50000;i++)    {        sum[i]=sum[i-1]+mu[i];    }}int solve(int n,int m){    if(n>m) swap(n,m);    int ans=0,pos;    for(int i=1;i<=n;i=pos+1)    {        pos=min(n/(n/i),m/(m/i));        ans+=(sum[pos]-sum[i-1])*(n/i)*(m/i);    }    return ans;}int main(){    init();    int n,a,b,c,d,k;    scanf("%d",&n);    while(n--)    {        scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);        a--;c--;        int ans=solve(b/k,d/k)-solve(a/k,d/k)-(solve(b/k,c/k)-solve(a/k,c/k));        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击