题解-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, ...
随机推荐
- 解决Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom:2.17 问题
详细报错如下 Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom:2.17 from http://maven ...
- Tomcat与Web应用
1.Web是一种分布式应用架构,旨在共享分布 在网络上的各个Web服务器中的所有互相链接的信息.Web使用超级文本技术(HTML)来链接网络上的信息,信息存放在服务器端,客户机通过浏览器查找网络中的各 ...
- python模块之自定义模块
模块概述 到此之前,我们都是在一个py文件里操作,接下来,我们学习模块的内容,可以从其他文件引入内容(如函数等) 1. 什么是模块 一个py文件就是一个模块,模块是一些相似功能的集合体 2. 为什么要 ...
- yum方式安装mysql
安装步骤 1. 安装yum仓库 到https://dev.mysql.com/downloads/repo/yum/ 下载对应操作系统版本的yum仓库,然后进行安装:sudo rpm -Uvh pla ...
- C语言 - 栈和单链表的实现
单链表:linkList.h linkList.c #ifndef LINKLIST_H_INCLUDE #define LINKLIST_H_INCLUDE #include <Windows ...
- 【LDAP】LDAP注入漏洞与防御
0x01 前言 前两天爆了一个LDAP漏洞,据说存在了8年现在才被发现,感概一下,不知这8年来有多少站被搞了... 想着复现这个漏洞,就先复习一下LDAP注入的相关知识吧,差了很多资料,记一下笔记. ...
- 【U3d】场景加载-GameStart!
目的:实现点击按钮场景切换 一共四个步骤,轻松食用(ง •̀_•́)ง 1. GameObject→UI→Button向开始场景中添加按钮,示例如下 2. 新建script——"LoadSc ...
- 【C++】reference parameter-引用参数
1.reference parameter 以下两个函数等效,只调用方式不同: 1> 1 int reset(int i){ 2 i = 13; 3 return i; 4 } 5 6 int ...
- 数组B:我想我需要一艘船屋
Fred Mapper is considering purchasing some land in Louisiana to build his house on. In the process o ...
- linux全部替换命令学习
:%s/准备替换内容/新内容/g 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符 :%s#vivian/#sky/#g 替换 vivian/ 为 sky/ :%s+/oradata/ap ...