#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. How To Create an IE-Only Stylesheet

    https://css-tricks.com/how-to-create-an-ie-only-stylesheet/ https://css-tricks.com/snippets/css/css- ...

  2. Linux Linux程序练习十三(信号阻塞,捕获)

    /* * 题目: * 请编写一个程序,设置SIGINT和SIGQUIT信号, * 并在该程序中实现从文件中读取信息的操作, * 并保证在读取文件且只有在读取文件的过程中不会被发送的SIGINT和SIG ...

  3. JS明确指定函数的接受者

    由于方法和值为对象的属性值没什么区别,因此很容易提取对象的方法作为回调函数直接传递给高阶函数.但这也很容易忘记应明确指定方法的接受者.例如,一个字符串缓冲对象使用数组来存储字符串. var buffe ...

  4. Linux下使用automake、autoconf生成configure文件

    一.生成configure过程中各文件之间的关系图 二.详细介绍 autoscan: 扫描源代码以搜寻普通的可移植性问题,比如检查编译器,库,头文件等,生成文件configure.scan,它是con ...

  5. mybatis3.2.8 与 hibernate4.3.6 混用

    mybatis.hibernate这二个框架各有特色,对于复杂的查询,利用mybatis直接手写sql控制起来更灵活,而一般的insert/update,hibernate比较方便.同一个项目中,这二 ...

  6. 让时间处理简单化 【第三方扩展类库org.apache.commons.lang.time】

    JAVA的时间日期处理一直是一个比较复杂的问题,大多数程序员都不能很轻松的来处理这些问题.首先Java中关于时间的类,从 JDK 1.1 开始,Date的作用很有限,相应的功能已由Calendar与D ...

  7. 深入理解Message, MessageQueue, Handler和Looper

    做过Android的都知道Message, MessageQueue, Handler和Looper,但知道不代表你理解它们.有时觉得用得很顺手,但Android怎么实现又说不上来,总觉得似懂非懂.不 ...

  8. NPOI2.0学习(一)

    引用空间 using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; 创建工作簿(workbook)和sheet HSSFWorkbook wk = new ...

  9. [poj 3537]Crosses and Crosses(博弈论)

    题目:http://poj.org/problem?id=3537 题意:给你n个格子,两个人依次在n个格子的任意空位置画"X",谁如果画了一个后,3个X连在了一起,那么那个人就获 ...

  10. WinForm程序执行JS代码的多种方法以及使用WebBrowser与JS交互

    方法一 使用微软官方组件Interop.MSScriptControl 1.msscript.ocx下载的地址   http://www.microsoft.com/downloads/details ...