• 【BZOJ3309】DZY Loves Math


    Time Limit: 5000 ms Memory Limit: 512 MB

      

    Description

      
    ​   对于正整数n,定义f(n)为n所含质因子的最大幂指数。例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0。
    ​   给定正整数a,b,求(sumlimits _{i=1}^a sumlimits_{j=1}^b f(gcd(i,j)))
      

    Input

      
      第一行一个数T,表示询问数。
      接下来T行,每行两个数a,b,表示一个询问。
      

    Output

      
    ​   对于每一个询问,输出一行一个非负整数作为回答。
      

    Sample Input

      
    ​   4
    ​   7558588 9653114
    ​   6514903 4451211
    ​   7425644 1189442
      ​ 6335198 4957
      

    Sample Output

      
    ​   35793453939901
    ​   14225956593420
    ​   4332838845846
      ​ 15400094813
      

    HINT

      
    【数据规模】
      T<=10000
    ​  1<=a,b<=10^7
      
      
      

    Solution

      
      这里用(n)(m)代表题目中的(a)(b)。-_-

    [egin{aligned} ans&=sum_{i=1}^nsum_{j=1}^mf(gcd(i,j))\ &=sum_{x=1}^{min(n,m)}f(x)*sum(x) &sum(x)为x=gcd(i,j)的(i,j)对数,满足i和j在n和m范围内\ &=sum_{x=1}^{min(n,m)}f(x)sum_{x|d}mu(frac dx)lfloorfrac nd floorlfloorfrac md floor\ &=sum_{x=1}^{min(n,m)}f(x)sum_{k=1}^{lfloor min(n,m)/x floor}mu(k)lfloorfrac n{kx} floorlfloorfrac m{kx} floor\ &=sum_{T=1}^{min(n,m)}lfloorfrac nT floorlfloorfrac mT floorsum_{d|T}f(d)mu(frac Td)\ &=sum_{T=1}^{min(n,m)}lfloorfrac nT floorlfloorfrac mT floor g(T) &令g(x)=sumlimits_{d|x}f(d)mu(frac xd) end{aligned} ]

      
    ​ 现在关键是求解(g)函数,完事后求(g)的前缀和,一样根号分段求(ans).
      
    ​ (1)当(x)为质数时,(g(x)=f(1)mu(x)+f(x)mu(1)=0+1=1)
      
      
      
      ​ (2)当筛到(x=p*i)时,分解质因数(x=p_1^{q_1}p_2^{q_2}...p_k^{q_k})(frac xd=p_1^{a_1}p_2^{a_2}...p_k^{a_k}),显然(或a_i=0或1),才能对(g(x))有贡献,不然(mu({frac xd})=0). 现在只考虑满足(或a_i=0或1)的因数(d).

    [egin{aligned} g(x)&=sum_{d|x}f(d)mu(frac xd)\ &=f(x)sum_{d|x且f(d)=f(x)} mu(frac xd)+(f(x)-1)sum_{d|x且f(d) e f(x)}mu(frac xd)\ &=-sum_{d|x且f(d) e f(x)}mu(frac xd) end{aligned} ]

      ​ 要满足(f(d) e f(x)),所有(q_i=f(x))(p_i)的指数在(d)中都要变成(q_i-1).
      
      1° 如果所有(q_i=f(x)),那么(a_i)全部取1,则(g(x)=-mu(p_1p_2...p_k)=-(-1)^k=(-1)^{k+1}),这里有个特殊情况,如果(i)(p)的完全平方数,即(i=p^{a_i}),(这里的(a)是最后提到的那个(a)数组),那么(x=p^{a_i+1}),则(g(x)=-mu(p)=1)
      
      2° 否则若存在(q_i e f(x))(g(x)=0).
      
    ​   记(A={i|q_i=f(x)},B={i|q_i e f(x)}).
      
    ​   对于(A)中的(i)(a_i)必须取1,而(B)中的(a_i)取0或1都可以,那么

    [egin{aligned} g(x)&=-summu((prod_{iin A}p_i)*(prod_{jin B}(p_j或1))\ &=-mu(prod_{iin A}p_i)summu(prod_{jin B}(p_j或1))\ &=-(-1)^{|A|}*0& prod_{iin B}(p_j或1)有奇数个质数和偶数个质数的情况次数一样,正负抵消\ &=0 &大快人心 end{aligned} ]

    ​  
      
    ​   线性筛时,维护一个(a_i)表示(i)的最小质因子(p_{min})的指数,(b_i)表示(p_{min}^{a_i}).
      
    ​   由于每次循环的(p)都是(x)的最小质因子,故每次更新时比较(a_i)(a_x)是否相同,如果相同就更新,如果不相同直接等于0,这样就可以保证每一个数(x)如果存在质因子指数不同的情况,(g(x))立即等于0. 详情见代码.
      
      
      

    #include <cstdio>
    using namespace std;
    typedef long long ll;
    const int N=1e7+1;
    int vis[N],lis[N],cnt;
    ll g[N],a[N],b[N];
    inline void swap(int &x,int &y){int t=x;x=y;y=t;}
    inline int min(int x,int y){return x<y?x:y;}
    void init(){
    	for(int i=2;i<N;i++){
    		if(!vis[i]){
    			lis[++cnt]=i;
    			a[i]=1; b[i]=i;
    			g[i]=1;
    		}
    		for(int j=1;j<=cnt&&i*lis[j]<N;j++){
    			int x=i*lis[j],p=lis[j];
    			vis[x]=1;
    			if(i%p==0){
                  	//d是i去除p后的数,i=d*p^ai, x=d*p^(ai+1) 故ax=ai+1,bx相应乘上p
    				a[x]=a[i]+1;	
    				b[x]=b[i]*p;
    				int d=i/b[i];
    				if(d==1) g[x]=1; //特殊情况(边界情况)i是p的幂 
    				else g[x]=(a[x]==a[d])?-g[d]:0;	 //若x满足所有指数相同,g(x)=g(d)乘上-1,否则为0
    				break;
    			}
    			a[x]=1; b[x]=p;
    			g[x]=a[i]==1?-g[i]:0; //原理同上
    		}
    	}
    	for(int i=2;i<N;i++) g[i]+=g[i-1];
    }
    int main(){
    	freopen("input.in","r",stdin);
    	init();
    	int T,a,b;
    	ll ans;
    	scanf("%d",&T);
    	while(T--){
    		scanf("%d%d",&a,&b);
    		if(a>b) swap(a,b);
    		ans=0;
    		for(int i=1,j;i<=a;i=j+1){
    			j=min(a/(a/i),b/(b/i));
    			ans+=1LL*(a/i)*(b/i)*(g[j]-g[i-1]);
    		}
    		printf("%lld
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    CentOS7安装(三)- 配置阿里云yum源
    OSQA的配置
    MySQL学习 (三) Limit-Distinct-Union
    MySQL学习(二)-字段类型及约束
    MySQL学习(一)-基本知识
    Python闭包
    软件测试面试常考点
    人生感悟
    常用的Linux命令
    细说php一些常见的知识点
  • 原文地址:https://www.cnblogs.com/RogerDTZ/p/8227485.html
Copyright © 2020-2023  润新知