zoukankan      html  css  js  c++  java
  • BZOJ 2694: Lcm

    Description

    定义整数(a,b),求满足下列条件的([a,b])的和.

    (1leqslant aleqslant A,1leqslant bleqslant B,forall n>1,n^2 mid (a,b),Tleqslant 2 imes 10^4,A,Bleqslant 4 imes 10^6)

    Solution

    数论.

    最后一个限制跟(mu)有点关系,可以吧(mu)平方一下..

    这个题实质上就是求

    (sum_{i=1}^nsum_{j=1}^mmu((i,j))^2[i,j])

    (=sum_{i=1}^nsum_{j=1}^mmu((i,j))^2frac{ij}{(i,j)})

    (=sum_{d}mu(d)^2sum_{i=1}^nsum_{j=1}^m[(i,j)=d]frac{ij}{d})

    (=sum_{d}mu(d)^2dsum_{i=1}^{lfloor frac{n}{d} floor}sum_{j=1}^{lfloor frac{m}{d} floor}[(i,j)=1]ij)

    (=sum_{d}mu(d)^2dsum_{i=1}^{lfloor frac{n}{d} floor}sum_{j=1}^{lfloor frac{m}{d} floor}sum_{pmid i}[pmid j]mu(p)ij)

    (=sum_{d}mu(d)^2dsum_{p}mu(p)p^2sum_{i=1}^{lfloor frac{n}{pd} floor}sum_{j=1}^{lfloor frac{m}{pd} floor}ij)

    ( ext{Let T=pd})

    (=sum_{T}sum_{dmid T}mu(d)^2dmu(frac{T}{d})frac{T}{d}^2sum_{i=1}^{lfloor frac{n}{T} floor}sum_{j=1}^{lfloor frac{m}{T} floor}ij)

    (=sum_{T}sum_{dmid T}mu(d)^2dmu(frac{T}{d})frac{T}{d}^2(sum_{i=1}^{lfloor frac{n}{T} floor}i)(sum_{j=1}^{lfloor frac{m}{T} floor}j))

    后面的式子可以直接分块来求,主要是前面的函数的前缀和.

    (g(n)=sum_{dmid n}mu(d)^2dmu(frac{n}{d})frac{n}{d}^2)

    因为他是积性函数的狄利克雷卷积,所以他也是积性函数,而且因为(mu)的存在,一个质数至多存在2个是才会有贡献.

    那么线性筛的时候,如果最小质因子超过2次,那么就是0,否则可以直接将它出去,变成两个互质的数.

    现在就是考虑(p^k)怎么算,因为(k)只会是(1,2),所以我们可以...人脑暴力...

    (g(p)=mu(1)^2mu(p)p^2+mu(p)^2pmu(1)=-p^2+p)

    (g(p^2)=mu(p)^2pmu(p)p^2=-p^3)

    做完了...因为我一口气写完了所有公式,而且不是用的编辑器...所以可能有错...如果发现请留言qwq...

    双倍经验 BZOJ 4659: Lcm

    Code

    /**************************************************************
        Problem: 2694
        User: BeiYu
        Language: C++
        Result: Accepted
        Time:2096 ms
        Memory:79424 kb
    ****************************************************************/
     
    #include <bits/stdc++.h>
    using namespace std;
     
    typedef long long ll;
    const int N = 4000500;
    const int p = 0x3fffffff;
     
    int T,n,m;
    int pr[N],cp,b[N],mu[N],g[N];
    int f[N];
     
    void pre(int n) {
        mu[1]=1,g[1]=1;
        for(int i=2;i<=n;i++) {
            if(!b[i]) pr[++cp]=i,mu[i]=-1,g[i]=(1-i)*i;
            for(int j=1;j<=cp && i*pr[j]<=n;j++) {
                b[i*pr[j]]=1;
                if(i%pr[j]) {
                    mu[i*pr[j]]=-mu[i];
                    g[i*pr[j]]=g[i]*g[pr[j]];
                } else {
                    if((i/pr[j])%pr[j]) g[i*pr[j]]=g[i/pr[j]]*(-pr[j]*pr[j]*pr[j]);
                    else g[i*pr[j]]=0;
                    break;
                }
            }
        }
        for(int i=1;i<=n;i++) g[i]+=g[i-1];
    //  for(int i=1;i<=n;i++) for(int j=i;j<=n;j+=i) f[j]+=mu[i]*mu[i]*mu[j/i]*(j/i);
    //  for(int i=1;i<=n;i++) f[i]=f[i]*i;
    //  for(int i=1;i<=n;i++) cout<<f[i]<<" ";cout<<endl;
    //  for(int i=1;i<=n;i++) cout<<g[i]<<" ";cout<<endl;
    }
     
    int S(int n) { return ((ll)n*(n+1)/2); }
     
    int main() {
    //  time_t tt=clock();
        pre(4000000);
    //  cout<<(clock()-tt)/1000.0/1000.0<<endl;
        for(scanf("%d",&T);T--;) {
            scanf("%d%d",&n,&m);
            if(n>m) swap(n,m);
            int ans=0;
            for(int i=1,j;i<=n;i=j+1) {
                j=min(n/(n/i),m/(m/i));
    //          cout<<i<<" "<<j<<" "<<S(n/i)*S(m/i)*(g[j]-g[i-1])<<endl;
                ans+=S(n/i)*S(m/i)*(g[j]-g[i-1]);
            }printf("%d
    ",ans&p);
        }
        return 0;
    }
    

      

  • 相关阅读:
    页面置换算法
    常见内存分配算法
    进程枚举
    NET程序之小试牛刀
    周易起名大师 v18.0算法分析
    VMP分析笔记(cmp命令在VM中的表达)
    一个重启验证软件的算法分析
    一次艰辛的算法分析---------飘零4.0封包分析
    某音频格式转换器算法分析
    一次苦中作乐的追码过程(下)
  • 原文地址:https://www.cnblogs.com/beiyuoi/p/6784395.html
Copyright © 2011-2022 走看看