• bzoj2301: [HAOI2011]Problem b


    模板莫比乌斯反演

    #include<bits/stdc++.h>
    using namespace std;
    bool not_prime[50100];
    int prime[50100],tot=0,sum[50100],mu[50100],a,b,c,d,k,T;
    int getit(int aa,int bb)
    {
    	if(aa>bb)swap(aa,bb);
    	int last,ans=0;
    	for(int i=1;i<=aa;i=last+1)
    	{
    		last=min(aa/(aa/i),bb/(bb/i));
    		ans+=(aa/i)*(bb/i)*(sum[last]-sum[i-1]);
    	}
    	return ans;
    }
    int main()
    {
    	scanf("%d",&T);
    	mu[1]=1;
    	for(int i=2;i<=50000;i++)
    	{
    		if(!not_prime[i])
    		{
    			prime[++tot]=i;
    			mu[i]=-1;
    		}
    		for(int j=1;j<=tot&&i*prime[j]<=50000;j++)
    		{
    			not_prime[prime[j]*i]=true;
    			if(i%prime[j]==0)
    			{
    				mu[i*prime[j]]=0;
    				break;
    			}
    			mu[i*prime[j]]=-1*mu[i];
    		}
    	}
    	for(int i=1;i<=50000;i++)
    		sum[i]=sum[i-1]+mu[i];
    	while(T--)
    	{
    		scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
    		a--;c--;
    		a/=k;b/=k;c/=k;d/=k;
    		printf("%d
    ",getit(b,d)+getit(a,c)-getit(a,d)-getit(c,b));
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    shell_02
    shell_practise
    Shell_01
    PythonDay_03
    PythonDay_02
    PythonDay_01
    面试题32:从上到下打印二叉树
    面试题 31 : 栈的压入、弹出序列
    面试题20 : 表示数值的字符串
    面试题29:顺时针打印矩阵
  • 原文地址:https://www.cnblogs.com/mybing/p/8335529.html
Copyright © 2020-2023  润新知