zoukankan      html  css  js  c++  java
  • 约数个数和

    前言

    越来越熟练

    题目

    洛谷

    讲解

    原式 (=sum_{i=1}^nsum_{j=1}^md(ij))

    (=sum_{i=1}^nsum_{j=1}^msum_{x|i}sum_{y|j}[gcd(x,y)=1]) 这一步可谓是至关重要!

    改写一下:(sum_{i=1}^nsum_{j=1}^mlfloorfrac{n}{i} floorlfloorfrac{m}{j} floor[gcd(i,j)=1])

    (f(x)=sum_{i=1}^nsum_{j=1}^mlfloorfrac{n}{i} floorlfloorfrac{m}{j} floor[gcd(i,j)=x])

    (F(x)=sum_{i=1}^nsum_{j=1}^mlfloorfrac{n}{i} floorlfloorfrac{m}{j} floor[x|gcd(i,j)])

    (Rightarrow F(x)=sum_{i=1}^{frac{n}{x}}sum_{j=1}^frac{m}{x}lfloorfrac{n}{xi} floorlfloorfrac{m}{xj} floor)

    (Rightarrow f(x)=sum_{x|d}mu(frac{d}{x})F(d))

    我们所求的即为 (f(1))

    (f(1)=sum_{d=1}^{min(n,m)}mu(d)sum_{i=1}^{frac{n}{d}}sum_{j=1}^frac{m}{d}lfloorfrac{n}{di} floorlfloorfrac{m}{dj} floor)

    (Rightarrow f(1)=sum_{d=1}^{min(n,m)}mu(d)sum_{i=1}^{frac{n}{d}}lfloorfrac{n}{di} floorsum_{j=1}^frac{m}{d}lfloorfrac{m}{dj} floor)

    (g(x)=sum_{i=1}^xlfloorfrac{x}{i} floor)

    (Rightarrow f(1)=sum_{d=1}^{min(n,m)}mu(d)g(lfloorfrac{n}{d} floor)g(lfloorfrac{m}{d} floor))

    预处理 (g(x)) 即可

    代码

    int prime[MAXN],pn,s[MAXN],mu[MAXN],g[MAXN];
    bool vis[MAXN]; 
    void sieve(int x)
    {
    	s[1] = mu[1] = 1;
    	for(int i = 2;i <= x;++ i)
    	{
    		if(!vis[i]) prime[++pn] = i,mu[i] = -1;
    		for(int j = 1;j <= pn && i * prime[j] <= x;++ j)
    		{
    			vis[i * prime[j]] = 1;
    			if(i % prime[j] ==0) break;
    			mu[i * prime[j]] = -mu[i];
    		}
    		s[i] = s[i-1] + mu[i];
    	}
    	for(int i = 1;i <= x;++ i)
    	{
    		LL ret = 0;
    		for(int l = 1,r;l <= i;l = r+1)
    		{
    			r = i / (i/l);
    			ret += 1ll * i / l * (r-l+1);
    		}
    		g[i] = ret;
    	}
    } 
    
    int main()
    {
    //	freopen(".in","r",stdin);
    //	freopen(".out","w",stdout);
    	sieve(50000);
    	for(int T = Read(); T ;-- T)
    	{
    		n = Read(); m = Read();
    		if(n > m) swap(n,m);
    		LL ans = 0;
    		for(int l = 1,r;l <= n;l = r+1)
    		{
    			r = Min(n/(n/l),m/(m/l));
    			ans += 1ll * (s[r] - s[l-1]) * g[n / l] * g[m / l];
    		}
    		Put(ans,'
    ');
    	}
    	return 0;
    }
    
  • 相关阅读:
    MongoDB数据库性能分析(转)
    C++中拷贝构造函数
    C++中的继承和组合区别使用
    几种调用约定
    动态规划(基础篇)
    C++中的三种继承public,protected,private
    STl中的排序算法
    STL中的常用算法
    C++初始化函数列表
    设计模式之装饰模式(Decorator)
  • 原文地址:https://www.cnblogs.com/PPLPPL/p/14273276.html
Copyright © 2011-2022 走看看