BZOJ_4176_Lucas的数论_杜教筛+莫比乌斯反演
BZOJ_4176_Lucas的数论_杜教筛+莫比乌斯反演
Description
去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了。

Input
第一行一个整数n。
Output
一行一个整数ans,表示答案模1000000007的值。
Sample Input
Sample Output
HINT
对于100%的数据n <= 10^9。
$f(nm)=\sum\limits_{i|n}\sum\limits_{j|m}[gcd(i,j)=1]$
证明:首先$ij|nm$,但直接枚举$ij$会有些重复。
设$gcd(i,j)=k,a=i/k,b=j/k$
发现一定能枚举到$i'=a*k,j'=b,$和$i''=a,j''=b*k$,此时$gcd(i',j')=gcd(i'',j'')=1$。
考虑$a*b*k$这个约数其实是被枚举了两次,不妨用这两次中的一个来‘代表’$a*b*k*k$。
因此我们枚举$gcd(i,j)=1$的$i,j$即可,只是此时$ij$可能有相等的,他们代表的约数不同。
可以举$n=2,m=6$的例子自己手算一下。
$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}f(ij)
=
\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum
\limits_{x|i}\sum\limits_{y|j}[gcd(x,y)=1]$
$=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum
\limits_{x|i}\sum\limits_{y|j}\sum\limits_{d|gcd(x,y)}\mu(d)$
$=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\sum
\limits_{x|i}\sum\limits_{y|j}\sum\limits_{d|gcd(x,y)}\mu(d)$
$=\sum\limits_{d=1}^{n}\mu(d)\sum\limits_{i=1}^{n/d}\sum\limits_{j=1}^{n/d}\sum
\limits_{x=1}^{\frac{n/d}{i}}\sum\limits_{y=1}^{\frac{n/d}{j}}$
$=\sum\limits_{d=1}^{n}\mu(d)(\sum\limits_{i=1}^{n/d}\frac{n/d}{i})^{2}$
$\mu$的前缀和用杜教筛搞,后面的只有$\sqrt{n/d}$种取值。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
ll mod=1000000007;
map<ll,ll>f;
int m=1000000;
int prime[1000050],cnt,miu[1000050],summiu[1000050];
bool vis[1000050];
ll calc1(ll n) {
if(n<=m) return summiu[n];
if(f.count(n)) return f[n];
ll i,lst,ans=1;
for(i=2;i<=n;i=lst+1) {
lst=n/(n/i);
ans=(ans-(lst-i+1)*calc1(n/i)%mod+mod)%mod;
}
return f[n]=ans;
}
ll calc2(ll n)
{
ll ans=0,i,lst;
for(i=1;i<=n;i=lst+1) {
lst=n/(n/i);
ans=(ans+n/i*(lst-i+1))%mod;
}
return ans*ans%mod;
}
void init() {
int i,j;
miu[1]=summiu[1]=1;
for(i=2;i<=m;i++) {
if(!vis[i]) {
prime[++cnt]=i;
miu[i]=-1;
}
for(j=1;j<=cnt&&i*prime[j]<=m;j++) {
vis[i*prime[j]]=1;
if(i%prime[j]==0) {
miu[i*prime[j]]=0;
break;
}
miu[i*prime[j]]=-miu[i];
}
summiu[i]=summiu[i-1]+miu[i];
}
}
int main() {
init();
ll n,ans=0,i,lst;
scanf("%lld",&n);
for(i=1;i<=n;i=lst+1) {
lst=n/(n/i);
ans=(ans+(calc1(lst)-calc1(i-1)+mod)%mod*calc2(n/i))%mod;
}
printf("%lld\n",ans);
}
BZOJ_4176_Lucas的数论_杜教筛+莫比乌斯反演的更多相关文章
- [bzoj 4176] Lucas的数论 (杜教筛 + 莫比乌斯反演)
题面 设d(x)d(x)d(x)为xxx的约数个数,给定NNN,求 ∑i=1N∑j=1Nd(ij)\sum^{N}_{i=1}\sum^{N}_{j=1} d(ij)i=1∑Nj=1∑Nd(ij) ...
- 【XSY2731】Div 数论 杜教筛 莫比乌斯反演
题目大意 定义复数\(a+bi\)为整数\(k\)的约数,当且仅当\(a\)和\(b\)为整数且存在整数\(c\)和\(d\)满足\((a+bi)(c+di)=k\). 定义复数\(a+bi\)的实部 ...
- [CQOI2015][bzoj3930] 选数 [杜教筛+莫比乌斯反演]
题面: 传送门 思路: 首先我们把区间缩小到$\left[\lfloor\frac{L-1}{K}\rfloor,\lfloor\frac{R}{K}\rfloor\right]$ 这道题的最特殊的点 ...
- [51Nod 1237] 最大公约数之和 (杜教筛+莫比乌斯反演)
题目描述 求∑i=1n∑j=1n(i,j) mod (1e9+7)n<=1010\sum_{i=1}^n\sum_{j=1}^n(i,j)~mod~(1e9+7)\\n<=10^{10}i ...
- bzoj 4916: 神犇和蒟蒻 (杜教筛+莫比乌斯反演)
题目大意: 读入n. 第一行输出“1”(不带引号). 第二行输出$\sum_{i=1}^n i\phi(i)$. 题解: 所以说那个$\sum\mu$是在开玩笑么=.= 设$f(n)=n\phi(n) ...
- [51nod1220] 约数之和(杜教筛+莫比乌斯反演)
题面 传送门 题解 嗯--还是懒得写了--这里 //minamoto #include<bits/stdc++.h> #define R register #define IT map&l ...
- Lucas的数论:杜教筛,莫比乌斯反演
Description: 求$\sum\limits_{i=1}^{n} \sum\limits_{j=1}^{n} d(i \times j)$ $d(i)$表示$i$的约数个数和.$n \leq ...
- 【知识总结】线性筛_杜教筛_Min25筛
首先感谢又强又嘴又可爱脸还筋道的国家集训队(Upd: WC2019 进候选队,CTS2019 不幸 rk6 退队)神仙瓜 ( jumpmelon ) 给我讲解这三种筛法~~ 由于博主的鸽子属性,这篇博 ...
- 【BZOJ4176】Lucas的数论-杜教筛
求$$\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}f(ij)$$,其中$f(x)$表示$x$的约数个数,$0\leq n\leq 10^9$,答案膜$10^9+ ...
随机推荐
- Spring Aop 梳理
Aspect Oriented Programming 面向切面编程.解耦是程序员编码开发过程中一直追求的.AOP也是为了解耦所诞生. 具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之 ...
- 从有值的ID到汉字编码
前些日子漫无目的地刷着朋友圈,突然一个ID从字丛中闯入我的眼睛--"某&字"(为保护当事人隐私,此处用'某''字'代替),浸淫于计算机而产生的直觉告诉我,这是一个有值的表达 ...
- 老司机告诉你高质量的Java代码是怎么练成的?
一提起程序员,首先想到的一定是"码农",对,我们是高产量的优质"码农",我们拥有超跃常人的逻辑思维以及不走寻常路的分析.判别能力,当然,我们也有良好的编码规范, ...
- CentOS6系列系统启动常见故障排查与解决方法
情景一.内核文件损坏 /boot/vmlinuz-2.6.32-642.el6.x86_64 内核文件 1.故障现象 2.解决方法:挂载光盘,进入rescue(救援)模式 3.选择--English- ...
- larave5.4自定义公共函数的创建
原文地址:http://blog.csdn.net/qq_38125058/article/details/76862151 公共函数,简单来说就是在任何地方都可以直接使用这个函数.简单介绍两种实现方 ...
- python_函数默认参数设计
>>> def printMax(a,b): if a>b: print(a,'is the max') else: print(b,'is hte max') >> ...
- Spring中的循环依赖
循环依赖 在使用Spring时,如果主要采用基于构造器的依赖注入方式,则可能会遇到循环依赖的情况,简而言之就是Bean A的构造器依赖于Bean B,Bean B的构造器又依赖于Bean A.在这种情 ...
- java集合HashMap、HashTable、HashSet详解
一.Set和Map关系 Set代表集合元素无序,集合元素不可重复的集合,Map代表一种由多个key-value组成的集合,map集合是set集合的扩展只是名称不同,对应如下 二.HashMap的工作原 ...
- Unity3D学习(一):简单梳理下Unity跨平台的机制原理
前言 首先需要了解的是,Unity3D的C#基础脚本模块是通过Mono来实现的. 什么是Mono? 参考下百度百科:Mono是一个由Novell公司(由Xamarin发起)主持的项目,并由Miguel ...
- expdb和impdb使用方法
一 关于expdp和impdp 使用EXPDP和IMPDP时应该注意的事项:EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具 ...