zoukankan      html  css  js  c++  java
  • 【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;
    }
    
  • 相关阅读:
    Hdu 1257 最少拦截系统
    Hdu 1404 Digital Deletions
    Hdu 1079 Calendar Game
    Hdu 1158 Employment Planning(DP)
    Hdu 1116 Play on Words
    Hdu 1258 Sum It Up
    Hdu 1175 连连看(DFS)
    Hdu 3635 Dragon Balls (并查集)
    Hdu 1829 A Bug's Life
    Hdu 1181 变形课
  • 原文地址:https://www.cnblogs.com/RogerDTZ/p/8227485.html
Copyright © 2011-2022 走看看