【文文殿下】【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 ...
随机推荐
- sql ltrim/rtrim 字段中为中文时出现?的问题
字段存储为中文,类型为nvarchar,使用ltrim时结果集中出现的问号,我的解决办法是:将问号replace掉
- Web开发者工具下载
登录微信公众号:https://mp.weixin.qq.com
- hg 添加用户
.hg目录下hgrc文件 [ui] username = lyd
- VS2010 MFC 使用GDI+给图片添加汉字
1.配置GDI+ VS2010自带GDI+,直接使用. (1)首先要添加头文件和库 #pragma comment( lib, "gdiplus.lib" ) #include & ...
- gj11 多线程、多进程和线程池编程
11.1 python中的GIL # coding=utf-8 # gil global interpreter lock (cpython) # python中一个线程对应于c语言中的一个线程 # ...
- Netty学习第二节Java IO通信
一.Java IO通信 名词解释: BIO通信: 采用BIO通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端连接,在接收到客户端请求后,为每一个客户端建立一个新的线程负 ...
- POJ 3686 The Windy's (最小费用流或最佳完全匹配)
题意:有n个订单m个车间,每个车间均可以单独完成任何一个订单.每个车间完成不同订单的时间是不同的.不会出现两个车间完成同一个订单的情况.给出每个订单在某个车间完成所用的时间.问订单完成的平均时间是多少 ...
- generate
一:generate Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,function, ...
- android2.1中<shape>圆角的bug
android的兼容性真是一个不可忽略的问题,今天测试时发现使用xml定义Shape drawable在android 2.1上存在bug <SPANstyle="FONT-SIZE: ...
- node express session
在express4.0版本以上,需要单独增加session模块:express-session:https://www.npmjs.com/package/express-session 具体做法是, ...