【spoj 5971】lcmsum
全场都 AK 了就我爆 0 了
题意
\(t\) 组询问,每组询问给定 \(n\),求 \(\sum\limits_{k=1}^n [n,k]\)。其中 \([a,b]\) 表示 \(a\) 和 \(b\) 的最小公倍数。
\(t\le 3\times 10^5,\space n\le 10^6\)
题解
怎么全世界都做过这题啊
前一天晚上听林老师说今天 T1 是莫比乌斯反演,然后我就出了一身冷汗……我没做过几道莫反,推不出来式子会不会被 D 啊……
然后到了今天……
我自己用模板的方法(?)推了个奇怪的长式子,写完后以为解不了,于是扔一边了……
后来才发现我 sb 了,其实可以解……
我推的式子大概是这样 $$ans = \sum\limits_{T=1}^n \sum\limits_{g|T} \frac{n (\frac{T}{g}+\lfloor \frac{n}{T}\rfloor \frac{T}{g}) \lfloor \frac{n}{T}\rfloor} {2} \sigma(n) \mu(\frac{T}{g}) \lfloor\frac{n}{T} \rfloor$$
(\(\sigma(n)\) 表示 \(n\) 的约数个数)
显然把 \(\frac{T}{g}\) 提出来,只与 \(\frac{T}{g}\) 有关的项都可以 \(O(n\log n)\) 预处理一下前缀和,查询的时候对 \(\lfloor \frac{n}{T}\rfloor\) 整除分块即可。
我才刚学莫比乌斯反演 \(1e-18\) 秒,就不能对我友好一点么
这个式子的正确性我就懒得验证了,因为标程做法根本就不是莫反,是个简单数论……各位巨佬如果发现我这个式子有问题的话,还烦请指正 \(\text{ヽ(*^ー^)人(^ー^*)ノ}\)
千万不能相信林老师预告的题目解法(flag)
标程的做法大致是这样:
很显然你没有看到任何莫反的痕迹,一个 \(\mu\) 函数都没有。
除了最后一行外,前面都很好理解。这里解释一下是怎么从倒数第二行 推出最后一行的(我大概就卡在这了):
我们提出这部分:\(\sum\limits_{k=1}^{\frac{n}{p}} [(k,\frac{n}{p})=1]\)
不难发现,它等于 \(\varphi(\frac{n}{p})\)。
然后我们考虑对于满足 \([(k,\frac{n}{p})=1]\) 的项 \(k\),把加 \(1\) 改成加 \(k\),即在 \([(k,\frac{n}{p})=1]\) 前面乘上 \(k\)。
这个好像不是很好求,但我们有这样一个经验:设 \(a\ge b\),则 \(\gcd(a,b)=\gcd(a,a-b)\)。运用到这里就是 \(\gcd(k,\frac{n}{p}) = \gcd(\frac{n}{p}-k,\frac{n}{p})\)。
也就是说,若 \([(k,\frac{n}{p})=1]\),则有 \([(\frac{n}{p}-k,\frac{n}{p})=1]\)。即要累加的 \(k\) 是以 \(\frac{n}{p}\) 为和成对出现的!
这个性质就很好,我们可以把加 \(k\) 改成加 \(\frac{\frac{n}{p}}{2}\) 了。显然后者是个定值。
所以我们简化倒数第二行式子得 $$ans = n\sum\limits_{p|n}^{n} \frac{\frac{n}{p}\times \varphi(\frac{n}{p}) + [\frac{n}{p}=1]} {2}$$ $$ans = n\sum\limits_{p|n}^{n} \frac{p\times \varphi(p) + [p=1]}{2}$$
\([p=1]\) 是因为当 \(p=1\) 时只有 \(1\) 个 \(k\),它并不能配对,也就不能当一对的平均数加。但由于加的 \(k\) 是 \(1\),直接在分子补上 \(1\) 就行了。
这就是标程做法的最后一行式子了。
什么?你问后面那段式子能不能被 \(2\) 整除?你把除以 \(2\) 扩大到等号右边全局不就行了?\(ans\) 肯定是个整数吧。
直到看了别人代码后我才发现后面那段式子一定被 \(2\) 整除……问了一下 scb 聚聚,他 1s 就证出来了,好强啊 ↓↓↓
把 \(\varphi\) 函数打个表就会发现,除了 \(\varphi(1)\) 和 \(\varphi(2)\) 是 \(1\) 以外,\(\varphi\) 值都是偶数。
考虑对 \(\varphi(x)(x\gt 2)\) 的 \(x\) 的奇偶性:
若 \(x\) 是奇数,它至少有一个奇数因子 \(y\),所以计算 \(\varphi(x)\) 时会乘一次 \(\frac{y-1}{y}\),而 \(y-1\) 是偶数,所以 \(\varphi(x)\) 是偶数。
若 \(x\) 是偶数,它会被分解成 \(2^z\times y\),显然 \(y\) 是奇数。当 \(y=1\) 时,\(\varphi(x)=\frac{x}{2}=2^{z-1}\),是个偶数;当 \(y\) 为其它奇数时,因为 \(\varphi\) 是积性函数,所以 \(\varphi(x) = \varphi(2^z) \varphi(y)\),而 \(\varphi(y)\) 是偶数,所以 \(\varphi(x)\) 是偶数。
所以当上述式子 \(p\gt 2\) 时,\(\varphi(p)\) 是偶数且 \([p=1]=0\),故分子是偶数,可以被 \(2\) 整除。
当上述式子 \(p=2\) 时,\(p\) 是偶数且 \([p=1]=0\),故分子是偶数。
当上述式子 \(p=1\) 时,\(p\times \varphi(p)=1\) 且 \([p=1]=1\),故分子是 \(2\),可以被 \(2\) 整除(其实也很显然除完后就是 \(k=1\))。
预处理 \(\varphi\) 即可。复杂度 \(O(q\log n)\)。
#include<bits/stdc++.h>
#define ll long long
#define N 1000000
using namespace std;
inline int read(){
int x=0; bool f=1; char c=getchar();
for(;!isdigit(c); c=getchar()) if(c=='-') f=0;
for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
if(f) return x; return 0-x;
}
int t,mx=0,cnt,a[N+5];
ll phi[N+5],pri[N+5],ans[N+5];
bool vis[N+5];
void init(){
phi[1]=1;
for(int i=2;i<=N;i++){
if(!vis[i]) pri[++cnt]=i, phi[i]=i-1;
for(int j=1; j<=cnt && i*pri[j]<=N; j++){
vis[pri[j]*i]=1;
if(i%pri[j]==0){
phi[i*pri[j]] = phi[i] * pri[j];
break;
}
phi[i*pri[j]] = phi[i] * (pri[j]-1);
}
}
}
int main(){
init();
t=read();
for(int i=1; i<=t; i++) mx = max(mx, a[i]=read());
for(int i=1; i<=mx; i++)
for(int j=1; i*j<=mx; j++)
ans[i*j] += (1ll * phi[i] * i + (i==1)) >> 1;
for(int i=1; i<=t; i++) printf("%lld\n", 1ll * ans[a[i]] * a[i]);
return 0;
}
做完这道题后我确信了一件事:我才刚学数论 \(1e-18\) 秒
【spoj 5971】lcmsum的更多相关文章
- BZOJ 2226 【SPOJ 5971】 LCMSum
题目链接:LCMSum 这个题显然就是要我们推式子了……那么就来推一波: \begin{aligned}&\sum_{i=1}^n lcm(i,n) \\=&\sum_{i=1}^n\ ...
- 【 SPOJ - GRASSPLA】 Grass Planting (树链剖分+树状数组)
54 种草约翰有 N 个牧场,编号为 1 到 N.它们之间有 N − 1 条道路,每条道路连接两个牧场.通过这些道路,所有牧场都是连通的.刚开始的时候,所有道路都是光秃秃的,没有青草.约翰会在一些道 ...
- 【SPOJ 2319】 BIGSEQ - Sequence (数位DP+高精度)
BIGSEQ - Sequence You are given the sequence of all K-digit binary numbers: 0, 1,..., 2K-1. You need ...
- 【SPOJ 694】Distinct Substrings (更直接的求法)
[链接]h在这里写链接 [题意] 接上一篇文章 [题解] 一个字符串所有不同的子串的个数=∑(len-sa[i]-height[i]) [错的次数] 0 [反思] 在这了写反思 [代码] #inclu ...
- 【SPOJ 694】Distinct Substrings
[链接]h在这里写链接 [题意] 给你一个长度最多为1000的字符串 让你求出一个数x,这个x=这个字符串的不同子串个数; [题解] 后缀数组题. 把原串复制一份,加在 ...
- 【SPOJ DQUERY】区间数字统计
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 因为区间的端点移动一个单位的话,只会涉及到一个元素的增多或减少. 因此可以用莫队算法来解决. 只需要开一个数组(大小1百万),用下标来快速检索 ...
- 【SPOJ 220】 PHRASES - Relevant Phrases of Annihilation
[链接]h在这里写链接 [题意] 给你n(n<=10)个字符串. 每个字符串长度最大为1e4; 问你能不能找到一个子串. 使得这个子串,在每个字符串里面都不想交出 ...
- 【SPOJ 7258】Lexicographical Substring Search
http://www.spoj.com/problems/SUBLEX/ 好难啊. 建出后缀自动机,然后在后缀自动机的每个状态上记录通过这个状态能走到的不同子串的数量.该状态能走到的所有状态的f值的和 ...
- 【SPOJ 1812】Longest Common Substring II
http://www.spoj.com/problems/LCS2/ 这道题想了好久. 做法是对第一个串建后缀自动机,然后用后面的串去匹配它,并在走过的状态上记录走到这个状态时的最长距离.每匹配完一个 ...
随机推荐
- python安装二进制k8s 1.11.0 一个master、一个node 查看node节点是主机名---apiserver无法启动,后来改了脚本应该可以
一.脚本说明: 本实验中master.node.etcd都是单体. 安装顺序为:先安装test1节点主要组件,然后开始安装test2节点,最后回头把test1节点加入集群中,这样做目的是理解以后扩容都 ...
- 【转】HBase shell命令与 scan 过滤器
Hbase 常用shell命令 https://www.cnblogs.com/i80386/p/4105423.html HBase基础之常用过滤器hbase shell操作 https://www ...
- java:ssh连接服务器,实现本地文件上传和下载
1.连接至服务器:ssh hp@10.10.17.16 -p 5555 下载文件:scp -r hp@10.10.17.16:/ccc(服务器路径,文件夹下所有文件) /path(本地路径) ...
- JavaScript基础入门10
目录 JavaScript 基础入门10 正则表达式 为什么使用正则表达式? 正则表达式的应用场景 如何创建一个正则表达式 基础语法 具有特殊意义的转义字符 量词 字符类 贪婪模式 练习 邮箱验证 中 ...
- 【FZU - 2150】Fire Game(bfs)
--> Fire Game 直接写中文了 Descriptions: 两个熊孩子在n*m的平地上放火玩,#表示草,两个熊孩子分别选一个#格子点火,火可以向上向下向左向右在有草的格子蔓延,点火的地 ...
- Asp.NetCore应用--部署到 ubuntu 进行托管
准备过程 netcore linux发布包(本人是通过vs2017发布) ubuntu 16.0.4虚机 进行托管 ubuntu netcore发布文件路径 服务器设置为将对 http://< ...
- 【Qt开发】QT对话框去掉帮助和关闭按钮 拦截QT关闭窗口的CloseEvent
建了一个对话框,我不想把边框去掉,只想去掉关闭按钮, setWindowFlags(windowFlags()&~Qt::WindowCloseButtonHint&~Qt::Wind ...
- python的变量 以及操作系统
变量 : (变量真没有什么好说的) 变: 就是会变化的 量:衡量现实的事物标准 python 中引用 变量值的作用 操作系统:就计算机控制硬件的软件,定义各个硬件的接口给应用软件调用 应用软件:在操作 ...
- java 给不同成绩分等级
题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. 程序分析:(a>b)?a:b这是条件运算符的基本例子. pack ...
- [转帖]influxdb和boltDB简介——MVCC+B+树,Go写成,Bolt类似于LMDB,这个被认为是在现代kye/value存储中最好的,influxdb后端存储有LevelDB换成了BoltDB
influxdb和boltDB简介——MVCC+B+树,Go写成,Bolt类似于LMDB,这个被认为是在现代kye/value存储中最好的,influxdb后端存储有LevelDB换成了BoltDB ...