题解-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, ...
随机推荐
- PHP中的表单传值
前言:试想一下如果PHP没有了表单传值,那么就相当于一个没有表达能力的人,因此表单传值在php中是相当重要的,但是不难,接下来我们一起来探讨一下吧------> (一)什么是表单传值 概念:表 ...
- WebStorm记录(2)
继续效果图 CSS初始化 前面理解错了,背景图应该铺满 <div class="bg"> html,body,*{ /*盒子模型使用边框模式*/ box-sizing: ...
- SpringMVC的概念和图解
1.概念 Spring MVC起步:慕课网视频 SpringMVC架构浅析:参考 Spring详解(一)------概述 Spring架构简单描述 2.图片
- IP简介(一)
1. OSI模型 TCP是TCP/IP的第三层传输层,对应OSI的第四层传输层: IP是TCP/IP的第二层互联层,对应OSI的第三层网络层. TCP属于OSI中的运输层它是面向连接的协议: IP属于 ...
- Django聚合与分组查询中value与annotate的顺序问题
在学习Django聚合与分组查询中,发现value与annotate的顺序不同时,查询结果大相径庭,经过一下午的研究,终于弄明白了,现在分享给大家,先上结论: 结论 value在annotate前面时 ...
- 万能五笔输入法"@相反
经过查找资料,发现是因为键盘使用的英国导致,改为美国解决,其他输入法没发现这个问题.
- 神奇的Content-Type——在JSON中玩转XXE攻击
大家都知道,许多WEB和移动应用都依赖于Client-Server的WEB通信交互服务.而在如SOAP.RESTful这样的WEB服务中,最常见的数据格式要数XML和JSON.当WEB服务使用XML或 ...
- 20155324 2016-2017-2 《Java程序设计》第5周学习总结
20155324 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 try.catch 1.求平均数程序示例 import java.util.Scanner; ...
- js去掉某一属性
将某一属性赋值为空就行了. 例如: document.getElementById('second').style.color = '';
- [C++]PAT乙级1001.害死人不偿命的(3n+1)猜想(15/15)
/* 1001.害死人不偿命的(3n+1)猜想 (15) 卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下 ...