BZOJ 2694: Lcm

Description

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

\(1\leqslant a\leqslant A,1\leqslant b\leqslant B,\forall n>1,n^2\nmid (a,b),T\leqslant 2\times 10^4,A,B\leqslant 4\times 10^6\)

Solution

数论.

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

这个题实质上就是求

\(\sum_{i=1}^n\sum_{j=1}^m\mu((i,j))^2[i,j]\)

\(=\sum_{i=1}^n\sum_{j=1}^m\mu((i,j))^2\frac{ij}{(i,j)}\)

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

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

\(=\sum_{d}\mu(d)^2d\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{d} \rfloor}\sum_{p\mid i}[p\mid j]\mu(p)ij\)

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

\(\text{Let T=pd}\)

\(=\sum_{T}\sum_{d\mid T}\mu(d)^2d\mu(\frac{T}{d})\frac{T}{d}^2\sum_{i=1}^{\lfloor \frac{n}{T} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{T} \rfloor}ij\)

\(=\sum_{T}\sum_{d\mid T}\mu(d)^2d\mu(\frac{T}{d})\frac{T}{d}^2(\sum_{i=1}^{\lfloor \frac{n}{T} \rfloor}i)(\sum_{j=1}^{\lfloor \frac{m}{T} \rfloor}j)\)

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

\(g(n)=\sum_{d\mid n}\mu(d)^2d\mu(\frac{n}{d})\frac{n}{d}^2\)

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

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

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

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

\(g(p^2)=\mu(p)^2p\mu(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\n",ans&p);
    }
    return 0;
}

  

时间: 2024-12-21 13:04:56

BZOJ 2694: Lcm的相关文章

【BZOJ】【2694】Lcm

数论/莫比乌斯反演/线性筛 题解:http://www.cnblogs.com/zyfzyf/p/4218176.html JZPTAB的加强版?感觉线性筛好像还是不怎么会啊……sad 题目记下来,回头再复习复习 1 /************************************************************** 2 Problem: 2694 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:1868

【莫比乌斯反演】关于Mobius反演与lcm的一些关系与问题简化(BZOJ 2154 crash的数字表格&amp;&amp;BZOJ 2693 jzptab)

BZOJ 2154 crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, 8) = 24.回到家后,Crash还在想着课上学的东西,为了研究最小公倍数,他画了一张N*M的表格.每个格子里写了一个数字,其中第i行第j列的那个格子里写着数为LCM(i, j).一个4*5的表格如下: 1 2 3 4 5 2 2 6 4

bzoj 2154 莫比乌斯反演求lcm的和

题目大意: 表格中每一个位置(i,j)填的值是lcm(i,j) , 求n*m的表格值有多大 论文贾志鹏线性筛中过程讲的很好 最后的逆元我利用的是欧拉定理求解的 我这个最后线性扫了一遍,勉强过了,效率不是很高... 1 /*bzoj 2154*/ 2 #include <bits/stdc++.h> 3 4 using namespace std; 5 #define ll long long 6 #define N 10000000 7 const int MOD = 20101009; 8

BZOJ 4103~4105 THUSC2015 题解

T1:BZOJ 4013 xor 题目大意:给定一个长度为n的数列a和一个长度为m的数列b,给定矩阵A,令Ai,j=ai⊕bj,q次询问某个子矩形里的k大值 n≤1000,m≤3?105,q≤500 刚看到这题的时候我发现我不会,看到数据范围的时候我发现出题人也不会-- 如果n=1,那么我们对这m个数建立可持久化Trie树,每次询问的时候查询异或a1的k大值即可 那么现在n=1000,我们只需要把这2000棵Trie树放在一起跑即可 时间复杂度O(m?32+n?q?32) 二分答案会T掉. #i

[BZOJ 1025] [SCOI2009] 游戏 【DP】

题目链接:BZOJ - 1025 题目分析 显然的是,题目所要求的是所有置换的每个循环节长度最小公倍数的可能的种类数. 一个置换,可以看成是一个有向图,每个点的出度和入度都是1,这样整个图就是由若干个环构成,这些环的长度和为 n . 因此,就是要求出和为 n 的正整数的最小公倍数的可能情况. 有一个性质:这些正整数中有合数存在的最小公倍数,都可以用全是质数的情况包含. 所以我们只要求出用质数组成的情况就可以了.我们要求的就是,若干个质数,它们的和小于等于 n,它们的最小公倍数情况. 先筛法求出

bzoj 2693: jzptab 线性筛积性函数

2693: jzptab Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 444  Solved: 174[Submit][Status][Discuss] Description Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M Output T行 每行一个整数 表示第i组数据的结果 Sample Input 1 4 5 Sample Output 122 HINT T <= 10000 N, M<=10000000

怒刷BZOJ记录(一)1001~1037

我实在是太弱了...不滚粗只能刷BZOJ了...这里来记录每天刷了什么题吧. 2015-7-9 : 1001[BeiJing2006]狼抓兔子                 | 最大流练习(呃..其实是平面图最大流辣) 1002[FJOI2007]轮状病毒                     | 基尔霍夫矩阵算生成树数量(呃..其实是DP辣) 2015-7-10: 1003[ZJOI2006]物流运输trans             | SPFA+DP 2015-7-11: 1004[H

BZOJ 1013: [JSOI2008]球形空间产生器sphere

二次联通门 : BZOJ 1013: [JSOI2008]球形空间产生器sphere /* BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元 QAQ SB的我也能终于能秒题了啊 设球心的坐标为(x,y,z...) 那么就可以列n+1个方程,化化式子高斯消元即可 */ #include <cstdio> #include <iostream> #include <cstring> #define rg register #define Max

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445