#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long int64;
const int mod=;
#define maxn 2000005
int top,tot,d[maxn],prim[maxn],mu[maxn];
bool vis[maxn];
int64 n,f[maxn],ans;
void prepare(){
tot=top=,memset(vis,,sizeof(vis)),mu[]=,mu[]=,f[]=;
for (int i=;i<maxn;i++){
if (vis[i]==){
prim[++top]=i;
d[i]=i;
mu[i]=-;
f[i]=;
}
for (int j=;j<=top;j++){
if (i*prim[j]>=maxn) break;
vis[i*prim[j]]=;
if (i%prim[j]==){
d[i*prim[j]]=d[i]*prim[j];
mu[i*prim[j]]=;
f[i*prim[j]]=f[i/d[i]]*(f[d[i]]+);
break;
}else{
d[i*prim[j]]=prim[j];
mu[i*prim[j]]=mu[i]*mu[prim[j]];
f[i*prim[j]]=f[i]*f[prim[j]];
}
}
}
for (int i=;i<maxn;i++) mu[i]+=mu[i-];
for (int i=;i<maxn;i++) f[i]=(f[i-]+f[i])%mod;
}
#define maxp 100007
#define maxm 4000005
int now[maxp],prep[maxm];
int64 val[maxm],id[maxm];
void insert(int x,int64 y){
int pos=x%maxp;
prep[++tot]=now[pos],now[pos]=tot,val[tot]=y,id[tot]=x;
}
int64 find(int x){
int pos=x%maxp;
for (int i=now[pos];i;i=prep[i]){
if (id[i]==x) return val[i];
}
return -;
}
int64 Mu(int x){
if (x<maxn) return mu[x];
int64 temp=find(x),t;
if (temp!=-) return temp;
temp=;
for (int j,i=;i<=x;i=j+){
j=x/(x/i); t=Mu(x/i);
temp=((temp-1LL*(j-i+)*t%mod)%mod+mod)%mod;
}
insert(x,temp); return temp;
}
int64 F(int x){
if (x<maxn) return f[x];
int64 temp=;
for (int j,i=;i<=x;i=j+){
j=x/(x/i);
temp=(temp+1LL*(x/i)*(j-i+)%mod)%mod;
}
return temp%mod;
}
int main(){
int64 temp;
prepare();
scanf("%lld",&n);
ans=;
for (int j,i=;i<=n;i=j+){
j=n/(n/i); temp=F(n/i);
ans=(ans+1LL*(Mu(j)-Mu(i-))%mod*temp%mod*temp%mod)%mod;
}
printf("%lld\n",(ans%mod+mod)%mod);
return ;
}

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4176

题目大意:

 答案对10^9+7取模。  1<=n<=10^9,单组询问。

吐槽:这是一个对我来说启发很大的题,加深了我对杜教筛的理解。

做法:式子不好写,还是用图好了。

然后用莫比乌斯反演继续化简:

这样就好办了,floor(n/k)最多只有O(sqrt(n))级别的取值,维护mu的前缀和?没错,既然不能预处理,那我们就杜教筛,F数组呢,没错,F[i]=sigam(i/j),1<=j<=i,可以sqrt(n)级别的复杂度做出,如果我们尽可能多的预处理出mu和F,那么可以把总复杂度降至O(n^(2/3)),足以过此题。

数论专项测试——约数个数和(lucas的数论)的更多相关文章

  1. Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和

    下文中所有讨论都在数论函数范围内开展. 数论函数指的是定义域为正整数域, 且值域为复数域的函数. 数论意义下的和式处理技巧 因子 \[ \sum_{d | n} a_d = \sum_{d | n} ...

  2. [BZOI 3994] [SDOI2015]约数个数和(莫比乌斯反演+数论分块)

    [BZOI 3994] [SDOI2015]约数个数和 题面 设d(x)为x的约数个数,给定N.M,求\(\sum _{i=1}^n \sum_{i=1}^m d(i \times j)\) T组询问 ...

  3. hdu 4542 数论 + 约数个数相关 腾讯编程马拉松复赛

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4542 小明系列故事--未知剩余系 Time Limit: 500/200 MS (Java/Others) ...

  4. UVA - 294 Divisors【数论/区间内约数最多的数的约数个数】

    Mathematicians love all sorts of odd properties of numbers. For instance, they consider to be an int ...

  5. 牛客:t次询问,每次给你一个数n,求在[1,n]内约数个数最多的数的约数个数(数论+贪心)

    https://ac.nowcoder.com/acm/contest/907/B t次询问,每次给你一个数n,求在[1,n]内约数个数最多的数的约数个数 分析: 根据约数和定理:对于一个大于1正整数 ...

  6. 【FZYZOJ】数论课堂 题解(约数个数定理)

    前言:想了两个小时orz,最后才想到要用约数个数定理…… ------------- 题目大意: 给定$n,q,A[1],A[2],A[3]$ 现有$A[i]=(A[i-1]+A[i-2]+A[i-3 ...

  7. Lucas的数论(math)

    Lucas的数论(math) 题目描述 去年的今日,Lucas仍然是一个热爱数学的孩子.(现在已经变成业界毒瘤了> <) 在整理以前的试题时,他发现了这么一道题目:求\(\sum\limi ...

  8. bzoj 4176: Lucas的数论 -- 杜教筛,莫比乌斯反演

    4176: Lucas的数论 Time Limit: 30 Sec  Memory Limit: 256 MB Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么 ...

  9. bzoj 4176 Lucas的数论

    bzoj 4176 Lucas的数论 和约数个数和那题差不多.只不过那个题是多组询问,这题只询问一次,并且 \(n\) 开到了 \(10^9\). \[ \begin{align*} \sum_{i= ...

随机推荐

  1. 您的项目引用了最新实体框架;但是,找不到数据链接所需的与版本兼容的实体框架数据库 EF6使用Mysql的技巧

    转载至: http://www.cnblogs.com/Imaigne/p/4153397.html 您的项目引用了最新实体框架:但是,找不到数据链接所需的与版本兼容的实体框架数据库 EF6使用Mys ...

  2. jQuery EasyUI 1.3.4 API CHM版下载

    网盘下载

  3. 关于用mybatis调用存储过程时的入参和出参的传递方法

    一.问题描述 a)         目前调用读的存储过程的接口定义一般是:void  ReadDatalogs(Map<String,Object> map);,入参和出参都在这个map里 ...

  4. opencv6.1-imgproc图像处理模块之平滑与形态学操作

    这个部分是<opencv-tutorials.pdf>的部分,这部分也是几大部分中例子最多的,其实这个教程的例子都很不错,不过有些看得出来还是c接口的例子,说明例子有些年头了,其实在&qu ...

  5. 为什么Javascript中的基本类型能调用方法?

    我们从一道笔试题说起: var str = 'string'; str.pro = 'hello'; console.log(str.pro + 'world'); 输出啥?要理解这个问题,我们得从头 ...

  6. 如何采集QQ群中所有成员QQ号码

    安装Google Chrome浏览器 安装Google插件:Regex Scraper 在群成员页面点击Regex 插件, 粘贴上这个代码 text_overflow">([\S\s] ...

  7. 离散系统频响特性函数freqz()

    MATLAB提供了专门用于求离散系统频响特性的函数freqz(),调用freqz()的格式有以下两种: l        [H,w]=freqz(B,A,N) B和A分别为离散系统的系统函数分子.分母 ...

  8. 服务端JavaScript之Rhino

    最近在看js的书,书上有介绍两个服务端js,以前只听说过node.js,第一次听说Rhino.js,并且已经集成到了jdk1.6;看来还是见的少啊! Rhino是一种用Java编写的javaScrip ...

  9. C 语言学习的第 04 课:编译器常见错误和警告(1)

    同学们可能已经开始使用 C-Free 5 写自己的程序了.但是新手编程,总是会有一些磕磕绊绊.不要紧,在这篇文章中,就主要来了解一些编程开始时经常会遇到的语法方面的问题. warning: no ne ...

  10. vim 快捷键

    1.vim ~/.vimrc 进入配置文件 如果不知道vimrc文件在哪,可使用 :scriptnames 来查看 set nu #行号 set tabstop=4 #一个tab为4个空格长度 set ...