BZOJ 4176 Lucas的数论 莫比乌斯反演+杜教筛
题意概述:求
,n<=10^9,其中d(n)表示n的约数个数。
分析:
首先想要快速计算上面的柿子就要先把d(ij)表示出来,有个神奇的结论:

证明:当且仅当a,b没有相同的质因数的时候我们统计其贡献,可以发现所有被统计的(a,b)乘积的质因数分解形式正好和i,j的所有因数的质因数分解形式一一对应,不重不漏(对于b中质因数指数不为0对应的就是i中指数+b中指数的情况,对于b中质因数指数为0的情况对应i中指数的情况)。
然后就有如下的推导:

对于这个式子,整个数字分段来算,n/d一共sqrt(n)种取值,用杜教筛求μ的前缀和,后面那部分每次可以用sqrt(n/d)的复杂度计算出来,整个时间复杂度大约是O(n^(3/4))。(实在是太玄学了这个时间复杂度我不是很会算ORZ)
至于杜教筛......这里我就不讲了吧,看dalao链接!:http://jiruyi910387714.is-programmer.com/posts/195270.html
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<cctype>
using namespace std;
const int mo=;
const int maxn=; int N,pri[maxn],mu[maxn],tot;
bool ntp[maxn];
struct Hash{
static const int sz=;
static const int maxn=;
int first[sz],np,next[maxn],id[maxn],val[maxn];
Hash(){
np=;
memset(first,,sizeof(first));
}
void ins(int pos,int v){
int i=pos%sz;
next[++np]=first[i],first[i]=np;
id[np]=pos,val[np]=v;
}
int query(int pos){
int i=pos%sz;
for(int p=first[i];p;p=next[p])
if(id[p]==pos) return val[p];
return -;
}
}hash; void get_mu()
{
ntp[]=ntp[]=,mu[]=;
for(int i=;i<=;i++){
if(!ntp[i]) pri[++tot]=i,mu[i]=-;
for(int j=;j<=tot&&1ll*pri[j]*i<=;j++){
ntp[i*pri[j]]=;
if(i%pri[j]==){ mu[pri[j]*i]=; break; }
mu[pri[j]*i]=-mu[i];
}
}
}
int F(int n){
int re=;
for(int i=,last;i<=n;i=last+)
last=n/(n/i),re=(re+1ll*(last-i+)*(n/i)%mo)%mo;
return re;
}
int S(int n){
int re=hash.query(n);
if(re!=-) return re;
re=;
for(int i=,last;i<=n;i=last+){
last=n/(n/i);
re=(re-1ll*(last-i+)*S(n/i)%mo+mo)%mo;
}
hash.ins(n,re);
return re;
}
int solve(int n)
{
int re=,f;
for(int i=,last;i<=n;i=last+){
last=n/(n/i),f=F(n/i);
re=(re+1ll*f*f%mo*(S(last)-S(i-)+mo)%mo)%mo;
}
return re;
}
int main()
{
get_mu();
int sum=;
for(int i=;i<=;i++)
hash.ins(i,sum=(sum+mu[i]+mo)%mo);
scanf("%d",&N);
printf("%d\n",solve(N));
return ;
}
BZOJ 4176 Lucas的数论 莫比乌斯反演+杜教筛的更多相关文章
- 【bzoj4176】Lucas的数论 莫比乌斯反演+杜教筛
Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i< ...
- BZOJ4652 [Noi2016]循环之美 【数论 + 莫比乌斯反演 + 杜教筛】
题目链接 BZOJ 题解 orz 此题太优美了 我们令\(\frac{x}{y}\)为最简分数,则\(x \perp y\)即,\(gcd(x,y) = 1\) 先不管\(k\)进制,我们知道\(10 ...
- BZOJ 3930: [CQOI2015]选数 莫比乌斯反演 + 杜教筛
求 $\sum_{i=L}^{R}\sum_{i'=L}^{R}....[gcd_{i=1}^{n}(i)==k]$ $\Rightarrow \sum_{i=\frac{L}{k}}^{\fra ...
- [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)
[BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...
- [复习]莫比乌斯反演,杜教筛,min_25筛
[复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...
- 【bzoj3930】[CQOI2015]选数 莫比乌斯反演+杜教筛
题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一 ...
- bzoj 4176: Lucas的数论【莫比乌斯反演+杜教筛】
首先由这样一个结论: \[ d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1] \] 然后推反演公式: \[ \sum_{i=1}^{n}\sum_{j=1}^{n}\su ...
- BZOJ4176 Lucas的数论 【莫比乌斯反演 + 杜教筛】
题目 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i<=N", ...
- 【CCPC-Wannafly Winter Camp Day3 (Div1) F】小清新数论(莫比乌斯反演+杜教筛)
点此看题面 大致题意: 让你求出\(\sum_{i=1}^n\sum_{j=1}^n\mu(gcd(i,j))\). 莫比乌斯反演 这种题目,一看就是莫比乌斯反演啊!(连莫比乌斯函数都有) 关于莫比乌 ...
随机推荐
- C++ map练习
C++ STL之map map介绍 C++里的map数据结构,会存储键值对信息key-value,通过key得到value的信息.map的key与value有一个特点就是:每个唯一的key拥有唯一对应 ...
- HTML | video的封面平铺方法
<video style="object-fit:fill;"></video>
- layui form表单 input输入框获取焦点后 阻止Enter回车自动提交
最简单的解决办法,不影响其他操作,给提交按钮增加 type="button" 属性 完美解决 <button type="button" class=&q ...
- 六个比较好用的php数组Array函数
1. array_column 返回输入数组中某个单一列的值.2. array_filter 用回调函数过滤数组中的元素.3. array_map 将用户自定义函数作用到给定数组的每个值上,返回新的值 ...
- 昊合数据整合平台HHDI常见问题
Q: HaoheDI和Informatica PowerCenter.IBM DataStage的区别在哪里? A: Informatica和DataStage是比较重量级的ETL平台,其自身就是比较 ...
- Altium Designer常用快捷键
一:Altium原理图快捷键: Shift+左键选择 :实现多个目标选择 Ctrl+左键拖动 :保持连线拖动目标 Shift+c :清除当前过滤(?? ...
- ruby语言里的self理解
关键的一句话:关键看谁调用self,self就属于谁 有3种情况: 1.在class或module的定义中,self代表这个class或者这个module对象,代码如下: class S puts ' ...
- 863. All Nodes Distance K in Binary Tree
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...
- N对数的排列问题 HDU - 2554
N对数的排列问题 HDU - 2554 有N对双胞胎,他们的年龄分别是1,2,3,……,N岁,他们手拉手排成一队到野外去玩,要经过一根独木桥,为了安全起见,要求年龄大的和年龄小的排在一起,好让年龄大的 ...
- VS中添加lib与dll
参考与拓展阅读:https://blog.csdn.net/u012043391/article/details/54972127 lib: 1.附加包含目录---添加工程的头文件目录: ...