zoukankan      html  css  js  c++  java
  • YY的GCD【莫比乌斯反演】

    [Luogu2257]YY的GCD
    (sum_{i=1}^nsum_{j=1}^m[(x, y))为质数(])
    (T le {10}^4, 1le n, m le {10}^7)
    假设(p)(M)以内的质数

    [egin{aligned}ans&=sum_{pin prime}sum_{i=1}^nsum_{j=1}^m[(i, j) == p]\ &=sum_{pin prime}sum_{x=1}^{lfloorfrac{n}{p} floor}mu(x)lfloorfrac{n}{xp} floorlfloorfrac{m}{xp} floorend{aligned}]

    (T=xp)

    [egin{aligned}ans&=sum_{T=1}^nsum_{pin prime ;&&; p|T}{mu(frac{T}{p})lfloorfrac{n}{T} floorlfloorfrac{m}{T} floor}\ &=sum_{T=1}^nlfloorfrac{n}{T} floorlfloorfrac{m}{T} floorsum_{pin prime ;&&; p|T}mu(frac{T}{q}) end{aligned} ]

    只要筛出(G(T)=sum_{pin prime ;&&; p|T}mu(frac{T}{q}))就可以(O(sqrt{N}))算出

    [ans=sum_{T=1}^nlfloorfrac{n}{T} floorlfloorfrac{m}{T} floor G(T) ]

    这题除了(ans)都不能开(long;long),不然会(TLE)

    void init(){
    	miu[1]=1;
    	for(int i=2; i < Maxn; i++){
    		if(!p[i]) p[++ptot]=i, miu[i]=-1;
    		for(int j=1, x; j <= ptot && (x=p[j]*i) < Maxn; j++){
    			p[x]=1; if(i%p[j] == 0) break; miu[x]=-miu[i];
    		}
    	}
    	for(int i=1; i <= ptot; i++) for(int j=p[i]; j < Maxn; j+=p[i]) G[j]+=miu[j/p[i]];
    	for(int i=1; i < Maxn; i++) G[i]+=G[i-1];
    }
    void solve(){
    	init(); int T=read();
    	while(T--){
    		n=read(), m=read(); ll ans=0; if(n > m) swap(n, m);
    		for(int l=1, r=0; r < n; l=r+1){
    			r=min(n/(n/l), m/(m/l));
    			ans+=1ll*(G[r]-G[l-1])*(n/l)*(m/l);
    		}
    		printf("%lld
    ", ans);
    	}
    }
    
  • 相关阅读:
    linux进程管理相关命令
    win7 64位系统使用vs2010编译OSG3.2.1
    Linux入门
    Implement strStr()
    Remove Element
    Remove Duplicates from Sorted Array
    Reverse Nodes in k-Group
    node npm vue.js 笔记
    NodeJS、NPM安装配置与测试步骤(windows版本)
    Python HTTP库requests中文页面乱码解决方案!
  • 原文地址:https://www.cnblogs.com/zerolt/p/9307569.html
Copyright © 2011-2022 走看看