●BZOJ 4176 Lucas的数论
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=4176
题解:
莫比乌斯反演,杜教筛
首先有这么一个结论:
令d(n)表示n的约数的个数(就是题目中的f(n)),则有
$$d(nm)=\sum_{i|n}\sum_{j|m}[gcd(i,j)==1]$$
●BZOJ 3994 [SDOI2015]约数个数和也用到了这个东西。
那么就下来接直接进行求ANS的式子的推导:
$$\begin{aligned}
ANS&=\sum_{n=1}^{N}\sum_{m=1}^{N}d(nm)\\
&=\sum_{n=1}^{N}\sum_{m=1}^{N}\sum_{i|n}\sum_{j|m}[gcd(i,j)==1]\\
&=\sum_{n=1}^{N}\sum_{m=1}^{N}\sum_{i|n}\sum_{j|m}\sum_{d|gcd(i,j)}\mu(d)\\
&=\sum_{d=1}^{N}\mu(d)\sum_{d|i}\sum_{d|j}\sum_{i|n,n\leq N}\sum_{j|m,m\leq N} 1\\
&=\sum_{d=1}^{N}\mu(d)(\sum_{d|i}\lfloor \frac{N}{i} \rfloor)^2\\
&=\sum_{d=1}^{N}\mu(d)(\sum_{i=1}^{\lfloor \frac{N}{d} \rfloor}\lfloor \frac{N}{id} \rfloor)^2\end{aligned}$$
令$$f(n)=\sum_{i=1}^{n}\lfloor \frac{n}{i} \rfloor$$
则$$ANS=\sum_{d=1}^{N}\mu(d)f(\lfloor \frac{N}{d} \rfloor)^2$$
这个求ANS的式子是可以分块+杜教筛(求每块$\mu$的和)做的,
同时求f也可以分块求,
即这是一个块套块。。。
代码:
#include<bits/stdc++.h>
#define DJM /*5623413*/ 1000000
using namespace std;
const int mod=1000000007;
struct Hash_Table{
#define Hmod 1425367
int org[DJM],val[DJM],nxt[DJM],head[Hmod],hnt;
Hash_Table(){hnt=1;}
void Push(int x,int v){
static int u; u=x%Hmod;
org[hnt]=x; val[hnt]=v; nxt[hnt]=head[u]; head[u]=hnt++;
}
int Find(int x){
static int u; u=x%Hmod;
for(int i=head[u];i;i=nxt[i])
if(org[i]==x) return val[i];
return -1;
}
}H;
int pmu[DJM+50],mu[DJM+50];
void Sieve(){
static bool np[DJM+50];
static int prime[DJM+50],pnt;
mu[1]=1;
for(int i=2;i<=DJM;i++){
if(!np[i]) prime[++pnt]=i,mu[i]=-1;
for(int j=1;j<=pnt&&i<=DJM/prime[j];j++){
np[i*prime[j]]=1;
if(i%prime[j]) mu[i*prime[j]]=-mu[i];
else break;
}
}
for(int i=1;i<=DJM;i++)
pmu[i]=(1ll*mod+pmu[i-1]+mu[i])%mod;
}
int f(int n){
int ret=0;
for(int i=1,last;i<=n;i=last+1){
last=n/(n/i);
ret=(1ll*ret+1ll*(last-i+1)*(n/i))%mod;
}
return ret;
}
int DJ_pmu(int n){
if(n<=DJM) return pmu[n];
if(H.Find(n)!=-1) return H.Find(n);
int ret=1;
for(int i=2,last;i<=n;i=last+1){
last=n/(n/i);
ret=(1ll*ret+mod-1ll*(last-i+1)*DJ_pmu(n/i)%mod)%mod;
}
H.Push(n,ret);
return ret;
}
int main(){
Sieve(); int n,ans=0;
scanf("%d",&n);
for(int d=1,tmp,last;d<=n;d=last+1){
last=n/(n/d); tmp=f(n/d);
tmp=1ll*tmp*tmp%mod;
ans=(1ll*ans+(1ll*DJ_pmu(last)-DJ_pmu(d-1)+mod)%mod*tmp%mod)%mod;
}
printf("%d\n",ans);
return 0;
}
●BZOJ 4176 Lucas的数论的更多相关文章
- bzoj 4176 Lucas的数论
bzoj 4176 Lucas的数论 和约数个数和那题差不多.只不过那个题是多组询问,这题只询问一次,并且 \(n\) 开到了 \(10^9\). \[ \begin{align*} \sum_{i= ...
- Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和
下文中所有讨论都在数论函数范围内开展. 数论函数指的是定义域为正整数域, 且值域为复数域的函数. 数论意义下的和式处理技巧 因子 \[ \sum_{d | n} a_d = \sum_{d | n} ...
- BZOJ 4176: Lucas的数论 [杜教筛]
4176: Lucas的数论 题意:求\(\sum_{i=1}^n \sum_{j=1}^n \sigma_0(ij)\) \(n \le 10^9\) 代入\(\sigma_0(nm)=\sum_{ ...
- bzoj 4176: Lucas的数论 -- 杜教筛,莫比乌斯反演
4176: Lucas的数论 Time Limit: 30 Sec Memory Limit: 256 MB Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么 ...
- 【刷题】BZOJ 4176 Lucas的数论
Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i< ...
- [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) ...
- BZOJ 4176 Lucas的数论 莫比乌斯反演+杜教筛
题意概述:求,n<=10^9,其中d(n)表示n的约数个数. 分析: 首先想要快速计算上面的柿子就要先把d(ij)表示出来,有个神奇的结论: 证明:当且仅当a,b没有相同的质因数的时候我们统计其 ...
- bzoj 4176: Lucas的数论【莫比乌斯反演+杜教筛】
首先由这样一个结论: \[ d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1] \] 然后推反演公式: \[ \sum_{i=1}^{n}\sum_{j=1}^{n}\su ...
- Lucas的数论题解
Lucas的数论 reference 题目在这里> < Pre 数论分块 默认向下取整时. 形如\(\sum\limits_{i=1}^n f\left( \frac{n}{i}\righ ...
随机推荐
- 第二次作业之微信小程序
2.1 介绍产品相关信息 你选择的产品是? 微信小程序 为什么选择该产品作为分析? 在等待了1年多以后,小程序终于在今年初上线,即速应用在H5领域的累计,便承接在小程序上.8月7日,即速应用的用户微信 ...
- C语言博客作业--数据类型
一.PTA实验作业 题目1:7-8 判断合法标识符 1. 本题PTA提交列表 2. 设计思路 1.定义整数型变量repeat和i来存放判断字符串是否为合法标识符的次数,定义字符型ch来存放读取的字符 ...
- 简易web服务器
当通过Socket开发网络应用程序的时候,首先需要考虑所使用的网络类型,主要包括以下三个方面: 1)Socket类型,使用网络协议的类别,如IPv4的类型为PF_INET. 2)数据通信的类型,常见的 ...
- 那些在django开发中遇到的坑
1. 关于csrf错误 CSRF(Cross-site request forgery)跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或 ...
- iOS开发-简单的循环结构分析
1.while循环 while (循环条件) { 循环体: } // 1.定义循环变量 ; // 2.循环条件 ) { // 3.循环体 printf("%d\n" ...
- 要学好JAVA要注意些什么?
从自学开始到参加系统的学习JAVA已经差不多有1个月了的时间了,在这段时间以前我也和很多人一样在网上盲目的搜罗一些视频来自己啃,随着时间的积累,对JAVA的认识也有了一定的提升,之前可能因为在IT咨询 ...
- Scala 操作符与提取器
实际上Scala没有操作符, 只是以操作符的格式使用方法. 操作符的优先级取决于第一个字符(除了赋值操作符), 而结合性取决于最后一个字符 Scala的操作符命名更加灵活:) 操作符 中置操作符(In ...
- Mybatis学习日志
在Mybatis深入学习的一周中,总感觉跟着师傅的视屏讲解什么都能懂,但实际自己操作的时候才发现自己一脸懵逼,不知道从何入手.但还好自己做了点笔记.在此记录一下自己浅度学习Mybatis遇到几个小问题 ...
- javascript学习(3)循环和判断
continue:: break:: 一.for循环 1.for(i=1;i<6;i++)循环 2.for(x in jsonObject)循环 二.while循环 1.while循环 2.do ...
- python入门(8)数据类型和变量
python入门(8)数据类型和变量 数据类型 在Python中,能够直接处理的数据类型有以下几种: 整数 Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样 ...