题解-bzoj2154Crash的数字表格 & bzoj2693 jzptab
Problem
\(T\)组询问(如果有),给定 \(n,m\),求
\]
\(T\leq 10^4,N,M\leq 10^7\)
Solution
┗|`O′|┛ 这两题花了我一整张草稿纸啊
首先明确将\(lcm\)转成\(gcd\)会更好做:\(lcm(x,y)=\frac {xy}{\gcd(x,y)}\)
套路枚举\(\gcd\):
\]
将 \(a,b\) 同时除以 \(d\)
\]
想到遇到互质的情况就莫反:
设置参量 \(n'=\frac nd,m'=\frac md\)
在参量意义下,构造函数
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)\)化简
\]
而\(Ans=\sum_dd\cdot f(1)\)
\]
首先可以明确如果预处理 \(\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\)):
\]
设 \(T=dt,S(x)=\frac {x(x+1)}2\),并将式子内外翻转可得
\]
设函数 \(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的更多相关文章
- BZOJ2154: Crash的数字表格 & BZOJ2693: jzptab
[传送门:BZOJ2154&BZOJ2693] 简要题意: 给出n,m,求$\sum_{i=1}^{n}\sum_{j=1}^{m}LCM(i,j)$ 题解: 莫比乌斯反演(因为BZOJ269 ...
- 莫比乌斯反演套路三、四--BZOJ2154: Crash的数字表格 && BZOJ2693: jzptab
t<=1e4个询问每次问n,m<=1e7,$\sum_{1\leqslant x \leqslant n,1 \leqslant y\leqslant m}lcm(x,y)$. 首先题目要 ...
- 【题解】[SDOI2017]数字表格
Link #include<bits/stdc++.h> using namespace std; #define int long long const int MAXN=1e6; in ...
- 【BZOJ2693】jzptab & 【BZOJ2154】Crash的数字表格
题目 弱化版题目的传送门([BZOJ2154]Crash的数字表格) 加强版题目的传送门([BZOJ2693]jzptab) 思路&解法 题目是要求: \(\sum\limits_{i = 1 ...
- 题解-[国家集训队]Crash的数字表格 / JZPTAB
题解-[国家集训队]Crash的数字表格 / JZPTAB 前置知识: 莫比乌斯反演 </> [国家集训队]Crash的数字表格 / JZPTAB 单组测试数据,给定 \(n,m\) ,求 ...
- 【莫比乌斯反演】关于Mobius反演与lcm的一些关系与问题简化(BZOJ 2154 crash的数字表格&&BZOJ 2693 jzptab)
BZOJ 2154 crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b ...
- BZOJ2154/BZOJ2693/Luogu1829 Crash的数字表格/JZPFAR 莫比乌斯反演
传送门--Luogu 传送门--BZOJ2154 BZOJ2693是权限题 其中JZPFAR是多组询问,Crash的数字表格是单组询问 先推式子(默认\(N \leq M\),所有分数下取整) \(\ ...
- 洛谷 P1829 [国家集训队]Crash的数字表格 / JZPTAB 解题报告
[国家集训队]Crash的数字表格 / JZPTAB 题意 求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)\),\(n,m\le 10^7\) 鉴于 ...
- [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∑Ny=1∑Mlim(x, ...
随机推荐
- 【.NET】using 语句中使用的类型必须可隐式转换为"System.IDisposable"
#问题: 在使用EF开发中,出现如下错误:“using 语句中使用的类型必须可隐式转换为“System.IDisposable” #原因: 项目中没有引用 EntityFramework 这个程序集: ...
- [JDK8] Lambda
本文转载原文http://www.cnblogs.com/jalja/p/7655170.html 一.使用线程 public static void main(String[] args) { // ...
- Address already in use : connect 的解决办法
最近做百万次通讯测试,在做并发测试时发现eclipse的控制台输出超过10万条信息时开始有报错内容 Address already in use : connect 这种错误多了后紧接着eclipse ...
- HDU 1284(钱币兑换 背包/母函数)
与 HDU 1028 相似的题目. 方法一:完全背包. 限制条件:硬币总值不超过 n. 目标:求出组合种数. 令 dp[ i ][ j ] == x 表示用前 i 种硬币组合价值为 j 的钱共 x 种 ...
- Golang入门教程(十二)安装注意事项
1.$GOPATH (1)go 命令依赖一个重要的环境变量:$GOPATH .注:这个不是Go安装目录 (2) (3) (4)git 安装 (5)包管理对应关系 (6)安装完之后bee 工具后,bee ...
- 开源框架.netCore DncZeus学习(一)npm安装
今天看到一个不错的开源项目DncZeus, https://github.com/lampo1024/DncZeus 整个界面挺漂亮,而且权限做到了按钮级别,功能也较容易扩展,刚好学习VUE纯看文章很 ...
- 微信调试工具测试时有时候复制URL没有corpid解决
可以直接去微信企业后台查询corpid,复制到粘贴到自己的url后面.
- Windows 常用的运行命令
1. 打开程序 1) calc 计算器 2) notepad 记事本 3) write ...
- springboot08-jpa-mysql
1.主要pom依赖: <!--jpa--> <dependency> <groupId>org.springframework.boot</groupId&g ...
- 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 ...