Problem

bzoj2818-单组询问-无权限

bzoj2693-多组询问-需权限

洛谷1829-单组询问-无权限

\(T\)组询问(如果有),给定 \(n,m\),求

\[\sum_{i=1}^n\sum_{j=1}^mlcm(i,j) \pmod {100000009}
\]

\(T\leq 10^4,N,M\leq 10^7\)

Solution

┗|`O′|┛ 这两题花了我一整张草稿纸啊

首先明确将\(lcm\)转成\(gcd\)会更好做:\(lcm(x,y)=\frac {xy}{\gcd(x,y)}\)

套路枚举\(\gcd\):

\[Ans=\sum_d\frac 1d\sum_{d|a}\sum_{d|b}[\gcd(\frac ad,\frac bd)=1]ab
\]

将 \(a,b\) 同时除以 \(d\)

\[Ans=\sum_d d\sum_{a=1}^{\frac nd}\sum_{b=1}^{\frac md}[\gcd(a,b)=1]ab
\]

想到遇到互质的情况就莫反:

设置参量 \(n'=\frac nd,m'=\frac md\)

在参量意义下,构造函数

\[f(x)=\sum_{a=1}^{n'}\sum_{b=1}^{m'}[\gcd(a,b)=x]ab\\
F(x)=\sum_{a=1}^{n'}\sum_{b=1}^{m'}[x|\gcd(a,b)]ab
\]

这俩函数满足\(F(x)=\sum_{x|n}f(n)\),根据莫反式有\(f(n)=\sum_{n|x}\mu(\frac xn)F(x)\)

将\(F(x)\)化简

\[F(x)=\sum_{x|a}^{n'}\sum_{x|b}^{m'}ab=x^2(\sum_{a=1}^{\frac {n'}x}a)(\sum_{b=1}^{\frac {m'}x}b)
\]

而\(Ans=\sum_dd\cdot f(1)\)

\[f(1)=\sum_d\mu(d)F(d)=\sum_d\mu(d)d^2(\sum_{a=1}^{\frac {n'}d}a)(\sum_{b=1}^{\frac {m'}d}b)
\]

首先可以明确如果预处理 \(\mu(d)d^2\) 就可以整除分块地在 \(O(\sqrt n)\) 的时间内算出这个式子

再接着考虑答案:\(Ans=\sum_dd\cdot f(1)\),而 \(f(1)\) 的参量由 \(d\) 决定,即应写成 \(Ans=\sum_dd\cdot f_{\frac nd,\frac md}(1)\),不难发现外层也能数论分块,即整个算法顶多是 \(O(n)\) 的

多组询问

上面这个式子每次计算需要 \(O(n)\) 的时间,实测跑完 \(T=10^4\) 组需要 \(92s\),需要考虑优化

由于在单组询问时是将带入参量进行计算的,这样虽然方便但不灵活,需要将参量化出来……以下省略若干字(因为算到这里后我又用了大半张草稿纸进行拆分合并 可能是因为我喜欢用参量吧,而且听学长说这题有个简便很多的方法)

首先将原式列出来(至于为什么在整除意义下有\(\frac {\frac ab}c=\frac a{bc}\),可以想想\(\frac ab=\frac {a-(a\bmod b)}b\)):

\[Ans=\sum_dd\bigl [\sum_t\mu(t)t^2\cdot (\sum_{a=1}^{\frac n{dt}}a)(\sum_{b=1}^{\frac m{dt}}b)\bigr ]
\]

设 \(T=dt,S(x)=\frac {x(x+1)}2\),并将式子内外翻转可得

\[Ans=\sum_{T=1}^nS(\frac nT)S(\frac mT)\sum_{d|T}\mu(d)d^2\frac Td\\=\sum_{T=1}^nS(\frac nT)S(\frac mT)T\sum_{d|T}\mu(d)d
\]

设函数 \(g(x)=x\sum_{d|x}\mu(d)d\),可得 \(Ans=\sum_{T=1}^nS(\frac nT)(\frac mT)g(T)\),这个东西就支持数论分块了,总体复杂度为\(O(n+Q\sqrt n)\)

至于怎么求 \(g(x)\),可以考虑只求 \(h(x)=\sum_{d|x}\mu(d)d\),这个东西是积性函数可以线性筛

具体地,在线性筛时,设当前筛数为 \(i\),质数为 \(p\),\(k=i\cdot p\)

  • 若 \(p|i\),有 \(h(k)=h(i)\),因为新加入的质因子 \(p\) 在 \(i\) 中已经出现,如果它不可能单独和其他质因子产生新的因数,而如果和其他的\(p\)因子在一起,\(\mu\)函数就会为 \(0\),所以有\(h(k)=h(i)\)
  • 若 \(p\not |i\),有 \(h(k)=h(i)h(j)\),因为新加入的质因子 \(p\) 在 \(i\) 中尚未出现,所以它和其他所有质因子产生的因数 \(\mu\) 都会变号,而因子\(p\)也会相应地乘上去,至于保留原来因子的贡献,\(h(p)\)在计算的时候会自带一个 \(1\)

Code

bzoj-2154

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int N=10001009,p=20101009;
int pri[N],is[N],u[N],tp; inline int sm(int x){
if(x&1)return (ll)x*(x+1>>1)%p;
return (ll)(x>>1)*(x+1)%p;
} inline int F(int n,int m){
int res=0;
for(int i=1,j;i<=n;i=j+1){
j=min(n/(n/i),m/(m/i));
res=(res+(ll)(u[j]-u[i-1]+p)*sm(n/i)%p *sm(m/i))%p;
}return res;
} int main(){
int n,m;
scanf("%d%d",&n,&m);
if(n>m)swap(n,m);u[1]=1;
for(int i=2;i<=n;++i){
if(!is[i])pri[++tp]=i,u[i]=-1;
for(int j=1,k;j<=tp and (k=i*pri[j])<=n;++j){
is[k]=1;
if(i%pri[j]==0){u[k]=0;break;}
u[k]=-u[i];
}
if(u[i]<0)u[i]=p-1;
u[i]=(u[i-1]+(ll)i*i%p*u[i])%p;
}
ll ans=0;
for(int i=1,j;i<=n;i=j+1){
j=min(n/(n/i),m/(m/i));
ans=(ans+(ll)(sm(j)-sm(i-1)+p)*F(n/i,m/i))%p;
}
printf("%lld\n",ans);
return 0;
}

bzoj-2693

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int N=10001009,p=100000009;
int pri[N],is[N],u[N],g[N],sm[N],tp; int main(){
u[1]=g[1]=1;
for(int i=2;i<N;++i){
if(!is[i])pri[++tp]=i,u[i]=p-1,g[i]=((ll)u[i]*i+1)%p;
for(int j=1,k;j<=tp and (k=i*pri[j])<N;++j){
is[k]=1;
if(i%pri[j]==0){u[k]=0,g[k]=g[i];break;}
u[k]=p-u[i],g[k]=(ll)g[i]*g[pri[j]]%p;
}
if(u[i]<0)u[i]=p-1;
} for(int i=1;i<N;++i){
u[i]=(u[i-1]+(ll)i*i%p*u[i])%p;
g[i]=(g[i-1]+(ll)i*g[i])%p;
sm[i]=(sm[i-1]+i<p?sm[i-1]+i:sm[i-1]+i-p);
} int n,m,T;
scanf("%d",&T);
while(T--){
ll ans=0;scanf("%d%d",&n,&m);
if(n>m)swap(n,m);
for(int i=1,j;i<=n;i=j+1){
j=min(n/(n/i),m/(m/i));
ans=(ans+(ll)sm[n/i]*sm[m/i]%p*(g[j]-g[i-1]+p))%p;
}printf("%lld\n",ans);
}return 0;
}

题解-bzoj2154Crash的数字表格 & bzoj2693 jzptab的更多相关文章

  1. BZOJ2154: Crash的数字表格 & BZOJ2693: jzptab

    [传送门:BZOJ2154&BZOJ2693] 简要题意: 给出n,m,求$\sum_{i=1}^{n}\sum_{j=1}^{m}LCM(i,j)$ 题解: 莫比乌斯反演(因为BZOJ269 ...

  2. 莫比乌斯反演套路三、四--BZOJ2154: Crash的数字表格 && BZOJ2693: jzptab

    t<=1e4个询问每次问n,m<=1e7,$\sum_{1\leqslant x \leqslant n,1 \leqslant y\leqslant m}lcm(x,y)$. 首先题目要 ...

  3. 【题解】[SDOI2017]数字表格

    Link #include<bits/stdc++.h> using namespace std; #define int long long const int MAXN=1e6; in ...

  4. 【BZOJ2693】jzptab & 【BZOJ2154】Crash的数字表格

    题目 弱化版题目的传送门([BZOJ2154]Crash的数字表格) 加强版题目的传送门([BZOJ2693]jzptab) 思路&解法 题目是要求: \(\sum\limits_{i = 1 ...

  5. 题解-[国家集训队]Crash的数字表格 / JZPTAB

    题解-[国家集训队]Crash的数字表格 / JZPTAB 前置知识: 莫比乌斯反演 </> [国家集训队]Crash的数字表格 / JZPTAB 单组测试数据,给定 \(n,m\) ,求 ...

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

    BZOJ 2154 crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b ...

  7. BZOJ2154/BZOJ2693/Luogu1829 Crash的数字表格/JZPFAR 莫比乌斯反演

    传送门--Luogu 传送门--BZOJ2154 BZOJ2693是权限题 其中JZPFAR是多组询问,Crash的数字表格是单组询问 先推式子(默认\(N \leq M\),所有分数下取整) \(\ ...

  8. 洛谷 P1829 [国家集训队]Crash的数字表格 / JZPTAB 解题报告

    [国家集训队]Crash的数字表格 / JZPTAB 题意 求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)\),\(n,m\le 10^7\) 鉴于 ...

  9. [bzoj 2693] jzptab & [bzoj 2154] Crash的数字表格 (莫比乌斯反演)

    题目描述 TTT组数据,给出NNN,MMM,求∑x=1N∑y=1Mlim(x,y)\sum_{x=1}^N\sum_{y=1}^M lim(x,y)\newlinex=1∑N​y=1∑M​lim(x, ...

随机推荐

  1. 【.NET】using 语句中使用的类型必须可隐式转换为"System.IDisposable"

    #问题: 在使用EF开发中,出现如下错误:“using 语句中使用的类型必须可隐式转换为“System.IDisposable” #原因: 项目中没有引用 EntityFramework 这个程序集: ...

  2. [JDK8] Lambda

    本文转载原文http://www.cnblogs.com/jalja/p/7655170.html 一.使用线程 public static void main(String[] args) { // ...

  3. Address already in use : connect 的解决办法

    最近做百万次通讯测试,在做并发测试时发现eclipse的控制台输出超过10万条信息时开始有报错内容 Address already in use : connect 这种错误多了后紧接着eclipse ...

  4. HDU 1284(钱币兑换 背包/母函数)

    与 HDU 1028 相似的题目. 方法一:完全背包. 限制条件:硬币总值不超过 n. 目标:求出组合种数. 令 dp[ i ][ j ] == x 表示用前 i 种硬币组合价值为 j 的钱共 x 种 ...

  5. Golang入门教程(十二)安装注意事项

    1.$GOPATH (1)go 命令依赖一个重要的环境变量:$GOPATH .注:这个不是Go安装目录 (2) (3) (4)git 安装 (5)包管理对应关系 (6)安装完之后bee 工具后,bee ...

  6. 开源框架.netCore DncZeus学习(一)npm安装

    今天看到一个不错的开源项目DncZeus, https://github.com/lampo1024/DncZeus 整个界面挺漂亮,而且权限做到了按钮级别,功能也较容易扩展,刚好学习VUE纯看文章很 ...

  7. 微信调试工具测试时有时候复制URL没有corpid解决

    可以直接去微信企业后台查询corpid,复制到粘贴到自己的url后面.

  8. Windows 常用的运行命令

    1. 打开程序 1)   calc                    计算器 2)   notepad                 记事本 3)   write                 ...

  9. springboot08-jpa-mysql

    1.主要pom依赖: <!--jpa--> <dependency> <groupId>org.springframework.boot</groupId&g ...

  10. luogu P3241 [HNOI2015]开店

    传送门 (下面记年龄为\(a_x\))题目要求的是\[\sum_{x=1}^{n} [a_x\in [l,r]]*dis(x,u)=\sum_{x=1}^{n} [a_x\in [l,r]]*de_x ...