【NOI P模拟赛】华莱士CNHLS(容斥,数论分块)
题意
出题人吃华 莱 士拉肚子了,心情不好,于是出了一道题面简单的难题。
共
T
T
T 组数据,对正整数
n
n
n 求
F
(
n
)
=
∑
i
=
1
n
μ
2
(
i
)
i
F(n)=\sum_{i=1}^n \mu^2(i)i
F(n)=i=1∑nμ2(i)i
对
2
64
2^{64}
264 取模的结果。
n
≤
1
0
14
,
T
≤
100.
n\leq 10^{14},T\leq100.
n≤1014,T≤100.
题解
莫比乌斯函数的平方,说明我们求的是
1
∼
n
1\sim n
1∼n 中所有无多个完全平方数因子的数的和。
我们用总和减去存在多个完全平方数因子的数,令
s
u
m
(
x
)
=
x
(
x
+
1
)
2
sum(x)=\frac{x(x+1)}{2}
sum(x)=2x(x+1),枚举最大完全平方数因子,可得
F
(
n
)
=
s
u
m
(
n
)
−
∑
j
=
2
n
j
2
F
(
⌊
n
j
2
⌋
)
F(n)=sum(n)-\sum_{j=2}^{\sqrt n}j^2F(\lfloor\frac{n}{j^2}\rfloor)
F(n)=sum(n)−j=2∑n
j2F(⌊j2n⌋)
于是,我们得到一个同
M
i
n
25
Min25
Min25 筛复杂度的做法,但是过不了。
考虑到枚举最大完全平方数因子太苛刻了,我们就直接枚举完全平方数因子,然后容斥。
具体地,对于每个质数,减去该质数平方的所有倍数,在对于每两个质数,加上平方之积的所有倍数……
这其实等价于对于每个数
i
i
i ,加上
μ
(
i
)
\mu(i)
μ(i) 乘该数平方的所有倍数,于是可得
F
(
n
)
=
∑
j
=
1
n
μ
(
j
)
j
2
s
u
m
(
⌊
n
j
2
⌋
)
F(n)=\sum_{j=1}^{\sqrt n}\mu(j)j^2sum(\lfloor\frac{n}{j^2}\rfloor)
F(n)=j=1∑n
μ(j)j2sum(⌊j2n⌋)
这已经是十分优秀的
O
(
T
n
)
O(T\sqrt n)
O(Tn
) 复杂度了,但是还是过不了。
我们发现对于许多段连续的
j
j
j ,
n
j
2
\frac{n}{j^2}
j2n 的值是相等的,而且,对于
j
≤
n
1
3
j\leq n^{\frac{1}{3}}
j≤n31 ,
⌊
n
j
2
⌋
\lfloor\frac{n}{j^2}\rfloor
⌊j2n⌋ 只有
n
1
3
n^{\frac{1}{3}}
n31 种取值,对于
j
>
n
1
3
j>n^{\frac{1}{3}}
j>n31 ,
⌊
n
j
2
⌋
<
n
1
3
\lfloor\frac{n}{j^2}\rfloor<n^{\frac{1}{3}}
⌊j2n⌋<n31,因为下取整,同样只有
n
1
3
n^{\frac{1}{3}}
n31 种取值。
所以我们数论分块,时间复杂度是
O
(
T
n
1
3
)
O(Tn^{\frac{1}{3}})
O(Tn31) 。
CODE
#include<set>
#include<map>
#include<cmath>
#include<stack>
#include<random>
#include<vector>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 10000005
#define LL long long
#define ULL unsigned long long
#define DB double
#define lowbit(x) (-(x) & (x))
#define ENDL putchar('\n')
#define FI first
#define SE second
LL read() {
LL f=1,x=0;int s = getchar();
while(s < '0' || s > '9') {if(s<0)return -1;if(s=='-')f=-f;s = getchar();}
while(s >= '0' && s <= '9') {x = (x<<3) + (x<<1) + (s^48); s = getchar();}
return f*x;
}
void putpos(LL x) {if(!x)return ;putpos(x/10);putchar('0'+(x%10));}
void putnum(LL x) {
if(!x) {putchar('0');return ;}
if(x<0) {putchar('-');x = -x;}
return putpos(x);
}
void AIput(LL x,int c) {putnum(x);putchar(c);}
int n,m,s,o,k;
const LL MX = 10000000;
ULL f[MAXN],mu[MAXN],su[MAXN];
int p[MAXN/2],cnt;
bool v[MAXN];
void sieve(int n) {
f[1] = 1;mu[1] = 1;
for(int i = 2;i <= n;i ++) {
if(!v[i]) p[++ cnt] = i,f[i] = i,mu[i] = 0ull-1ull;
for(int j = 1;j <= cnt && i*p[j] <= n;j ++) {
v[i*p[j]] = 1;
if(i % p[j] == 0) {f[i*p[j]] = 0;break;}
f[i*p[j]] = f[i]*p[j];
mu[i*p[j]] = 0ull-mu[i];
}
}
for(int i = 2;i <= n;i ++) f[i] += f[i-1];
for(int i = 1;i <= n;i ++) su[i] = su[i-1] + mu[i]*i*i;
return ;
}
ULL sm(LL x) {return (x&1) ? (((x+1)>>1) * x) : ((x>>1) * (x+1));}
ULL F(LL x) {
if(x < 1) return 0;
if(x <= MX) return f[x];
ULL rs = 0;
for(LL i = 1;i*1ll*i <= x;i ++) {
LL r = sqrt((DB)x/(x/(i*1ll*i)));
rs += sm(x/(i*1ll*i)) * (su[r] - su[i-1]);
i = r;
}
return rs;
}
int main() {
freopen("kfc.in","r",stdin);
freopen("kfc.out","w",stdout);
sieve(MX);
int T = read();
while(T --) {
LL N = read();
printf("%llu\n",F(N));
}
return 0;
}
【NOI P模拟赛】华莱士CNHLS(容斥,数论分块)的更多相关文章
- 洛谷P2260 [清华集训2012]模积和(容斥+数论分块)
题意 https://www.luogu.com.cn/problem/P2260 思路 具体思路见下图: 注意这个模数不是质数,不能用快速幂来求逆元,要用扩展gcd. 代码 #include< ...
- 【NOI P模拟赛】最短路(树形DP,树的直径)
题面 给定一棵 n n n 个结点的无根树,每条边的边权均为 1 1 1 . 树上标记有 m m m 个互不相同的关键点,小 A \tt A A 会在这 m m m 个点中等概率随机地选择 k k k ...
- LOJ575. 「LibreOJ NOI Round #2」不等关系 [容斥,分治FFT]
LOJ 思路 发现既有大于又有小于比较难办,使用容斥,把大于改成任意减去小于的. 于是最后的串就长成这样:<<?<?<??<<<?<.我们把一段连续的& ...
- 【NOI P模拟赛】(要素过多的标题)(容斥原理)
题面 0 题目背景 [ 数 据 删 除 ] _{^{[数\,据\,删\,除]}} [数据删除] 1 题目描述 在执行任务时,收集到了 n n n 份能源,其中第 i i i 份的能量值是 ...
- [NOI P模拟赛] 传统艺能(子序列自动机、矩阵乘法,线段树)
(2:00)OID:"完了,蓝屏了!"(代码全消失) 众人欢呼 OID:开机,"原题测试--" (30min later)OID 开始传统艺能: " ...
- HDU 4135 Co-prime(容斥+数论)
Co-prime Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- BZOJ 2005: [Noi2010]能量采集(容斥+数论)
传送门 解题思路 首先题目要求的其实就是\(\sum\limits_{i=1}^n \sum\limits_{j=1}^m [(gcd(i,j)-1)*2+1)]\),然后变形可得\(-n*m+2\s ...
- [7.18NOIP模拟测试5]砍树 题解(数论分块)
题面(加密) 又考没学的姿势……不带这么玩的…… 考场上打了个模拟 骗到30分滚粗了 稍加思考(滑稽)可将题面转化为: 求一个最大的$d$,使得 $\sum \limits _{i=1}^n {(\l ...
- noi.acNOIP模拟赛5-count
题目链接 戳我 题意简述 你有一个n+1个数的序列,都是1~n,其中只有一个有重复,求每个长度的本质不同的子序列个数.\(mod 1e9+7\). sol 说起来也很简单,设相同的数出现的位置为\(l ...
随机推荐
- 互联网大厂目标管理OKR实践落地与反思
上一篇「 互联网公司目标管理OKR和绩效考核的误区 」介绍了使用 OKR 时要澄清的一些概念,但是实际使用中又如何呢?我们快手也是很大的互联网公司,大家都是年轻人,思维活跃,容易接受新事物,敢尝试,但 ...
- 【Redis】简单动态字符串SDS
C语言字符串 char *str = "redis"; // 可以不显式的添加\0,由编译器添加 char *str = "redis\0"; // 也可以添加 ...
- 使用nodejs的wxmnode模块,开发一个微信自动监控提醒功能,做个天气预报。
这个模块是一个公众号的模块,名字叫"帮你看着". 原本这个公众号是做股票监控提醒的,我也没炒股.因为接口支持写入任何内容,所以可以有其他的用处.比如做成天气预报定时提醒. 我们去n ...
- word-制作三线表
找一个表格或插入一个表格, 找到 [设计] [新建表格样式] [将格式应用于: 整个表格] 点击"框线设置"按钮,在弹出的下拉菜单中分别选择 [上框线] 和 [下框线],然后分别设 ...
- HDLBits->Circuits->Multiplexers->Mux256to1v
Verilog切片语法 题目要求如下 Create a 4-bit wide, 256-to-1 multiplexer. The 256 4-bit inputs are all packed in ...
- SAP 实例 1 Images in HTML
REPORT zharpo_010 NO STANDARD PAGE HEADING. TABLES : t001. TYPE-POOLS: slis. DATA : w_repid LIKE sy- ...
- 如何修改 node_modules 里的文件
前言 有时候使用npm上的包,发现有bug,我们知道如何修改,但是别人可能一时半会没法更新,或者是我们特殊需求,别人不愿意修改,这时候我们只能自己动手丰衣足食.那么我们应该如何修改别人的源码呢?首先, ...
- Linux 源码编译安装软件
程序包编译安装的步骤: 源代码-->预处理-->编译-->汇编-->链接-->执行 多文件:文件中的代码之间,很可能存在跨文件依赖关系 1.编译源码的项目工具 使用相关的 ...
- 【机器学习】K-means聚类分析
前言 聚类问题是无监督学习的问题,算法思想就是物以类聚,人以群分,聚类算法感知样本间的相似度,进行类别归纳,对新输入进行输出预测,输出变量取有限个离散值.本次我们使用两种方法对鸢尾花数据进行聚类. 无 ...
- 爬虫(14) - Scrapy-Redis分布式爬虫(1) | 详解
1.什么是Scrapy-Redis Scrapy-Redis是scrapy框架基于redis的分布式组件,是scrapy的扩展:分布式爬虫将多台主机组合起来,共同完成一个爬取任务,快速高效地提高爬取效 ...