【文文殿下】【BZOJ4804】欧拉心算
题解
显然有 \(ans=\sum _{i=1} ^{n} \lfloor \frac{n}{i} \rfloor \sum _{d|i} \mu(d) \phi (\frac{i}{d})\)
前半部分就是个整除分块,后半部分直接让脑子受到了冲击。
但是,我们知道,两个积性函数的\(\text{Direchlet}\)卷积还是积性函数,我们考虑构造线性筛。
我们看到其中有\(\text{Mobius}\)函数,鲁迅曾经说过“一看到\(\mu\),就想到积性函数,就想到唯一分解,就想到\(>2\)的幂的贡献不计,就想到线性筛,\(\text{OIer}\)只有在这个方面思想如此跃进。”
我们尝试对一个数\(T\)因数分解。
设\(h(x)=\sum _{d|x} \mu(d) \phi (\frac{i}{d})\)对于其中一个素因子\(p\)和他的出现次数\(q\),\(x=p^q\)我们发现
\(h(x)=1,q=0\)
\(h(x)=p-2,q=1\)
\(h(x)=p^{q-2}(p-1)^2,q>=2\)
显然$h(T)=\prod _{i=1}^{t} h(p_i^{q_i}) $我们根据这个构造线性筛
#include<cstdio>
typedef long long ll;
const int maxn = 1e7+10;
ll h[maxn];
int prime[maxn],cnt,n;
bool vis[maxn];
inline void prelude() {
h[1]=1;
for(int i = 2;i<maxn;++i) {
if(!vis[i]) {
h[i]=i-2;
prime[++cnt]=i;
}
for(int j = 1;j<=cnt&&1LL*prime[j]*i<maxn;++j) {
vis[i*prime[j]]=1;
if(i%prime[j]==0) {
if(i/prime[j]%prime[j]==0) {
h[i*prime[j]]=h[i]*prime[j];// 三次方及以上
}
else h[i*prime[j]]=h[i/prime[j]]*(prime[j]-1)*(prime[j]-1); //二次方,分界点
break;
}
else {
h[i*prime[j]]=h[i]*h[prime[j]];
}
}
}
for(int i = 1;i<maxn;++i) h[i]+=h[i-1];
}
inline ll solve() {
ll ans = 0;
for(int i = 1,cur;i<=n;i=cur+1) {
cur = n/(n/i);
ans+=(h[cur]-h[i-1])*(n/i)*(n/i);
}
return ans;
}
int main() {
prelude();
int T;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
printf("%lld\n",solve());
}
return 0;
}
【文文殿下】【BZOJ4804】欧拉心算的更多相关文章
- BZOJ4804 欧拉心算(莫比乌斯反演+欧拉函数+线性筛)
一通套路后得Σφ(d)μ(D/d)⌊n/D⌋2.显然整除分块,问题在于怎么快速计算φ和μ的狄利克雷卷积.积性函数的卷积还是积性函数,那么线性筛即可.因为μ(pc)=0 (c>=2),所以f(pc ...
- [BZOJ4804]欧拉心算
题面戳我 题意:求 \[\sum_{i=1}^{n}\sum_{j=1}^{n}\phi(\gcd(i,j))\] 多组数据,\(n\le10^7\). sol SBT 单组数据\(O(\sqrt n ...
- BZOJ4804: 欧拉心算(莫比乌斯反演 线性筛)
题意 求$$\sum_1^n \sum_1^n \phi(gcd(i, j))$$ $T \leqslant 5000, N \leqslant 10^7$ Sol 延用BZOJ4407的做法 化到最 ...
- bzoj4804: 欧拉心算 欧拉筛
题意:求\(\sum_{i=1}^n\sum_{j=1}^n\phi(gcd(i,j))\) 题解:\(\sum_{i==1}^n\sum_{j=1}^n\sum_{d=1}^n[gcd(i,j)== ...
- 并不对劲的bzoj4804:欧拉心算
题目大意 \(t\)(\(t\leq5000\))组询问,每次询问给出\(n\)(\(n\leq10^7\)),求: \[\sum_{i=1}^{n}\sum_{j=1}^{n}\phi(gcd(i, ...
- [BZOJ4804]欧拉心算:线性筛+莫比乌斯反演
分析 关于这道题套路到不能再套路了没什么好说的,其实发这篇博客的目的只是为了贴一个线性筛的模板. 代码 #include <bits/stdc++.h> #define rin(i,a,b ...
- 【bzoj4804】欧拉心算 解题报告
[bzoj4804]欧拉心算 Description 给出一个数字\(N\),计算 \[\sum_{i=1}^n\sum_{j=1}^n \varphi(\gcd(i,j))\] Input 第一行为 ...
- 【BZOJ4804】欧拉心算 莫比乌斯反演+线性筛
[BZOJ4804]欧拉心算 Description 给出一个数字N Input 第一行为一个正整数T,表示数据组数. 接下来T行为询问,每行包含一个正整数N. T<=5000,N<=10 ...
- BZOJ_4804_欧拉心算_欧拉函数
BZOJ_4804_欧拉心算_欧拉函数 Description 给出一个数字N Input 第一行为一个正整数T,表示数据组数. 接下来T行为询问,每行包含一个正整数N. T<=5000,N&l ...
- bzoj 4804 欧拉心算 欧拉函数,莫比乌斯
欧拉心算 Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 408 Solved: 244[Submit][Status][Discuss] Descr ...
随机推荐
- git(常用命令)思维导图...
Git 是一个很强大的分布式版本控制系统.它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势. 来自文章:http://www.cnblogs.com/1-2-3/archive ...
- Qt中使用python--Hello Python!
step1:install Python (version 2.7 or higher): step2:The configuration is as follows: 1.create qt con ...
- 三维dem
关注World wind Java,<World wind Java三维地理信息系统开发指南随书光盘 1. 下载worldwind java sdk 下载地址:http://builds.wor ...
- pip安装python模块方法
网上搜索了很多,主流的配置方法分为两种: 摘自 1.http://www.jb51.net/article/83617.htm 安装pip的包并确定pip安装时的镜像源地址,国内常用的地址有: htt ...
- Bootstrap验证
<div class="modal fade" id="myModal" tabindex="-1" role="dialo ...
- oracle去重试验
http://blog.csdn.net/lunajiao/article/details/76014488
- win8 app code中设置Resources里定义好的Style
WPF中应该可以用这个: rectangle.Style = (Style)FindResource("FormLabelStyle"); 但 Win8.1 App是个精简框架,F ...
- Crash以及报错总结
CoreData: Cannot load NSManagedObjectModel.nil is an illegal URL parameter 这是因为在工程中CoreData的命名和AppDe ...
- yum 报错:centos yum (28, 'Connection time-out') Trying other mirror.
前言: 在使用yum安装 软件时,经常出现 centos yum (28, 'Connection time-out') Trying other mirror. 或下面的那样情况imeout on ...
- html5.css3新特性
块: article section, Nav aside header footer 内容分组 future fig caption main 文本级别标签 time i b em str ...