4176: Lucas的数论

题意:求\(\sum_{i=1}^n \sum_{j=1}^n \sigma_0(ij)\) \(n \le 10^9\)


代入\(\sigma_0(nm)=\sum_{i\mid n}\sum_{j\mid m}[(i,j)=1]\)

反演得到

\[\sum_{d=1}^n \mu(d) (g(\frac{n}{d}))^2 \\
g(n) = \sum_{i=1}^n \sigma_0(i)
\]

杜教筛\(\mu \ \sigma_0\)的前缀和

当然和前面的题一样,\(\sigma_0\)也可以用预处理+分块

复杂度\(O(n^{\frac{2}{3}})\)

把上题TLE的杜教筛代码抄上就行了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <ctime>
using namespace std;
typedef long long ll;
const int N=1664512, mo=1e9+7;
int U=1664510;
inline ll read(){
char c=getchar(); ll x=0,f=1;
while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
return x*f;
} inline void mod(int &x) {if(x>=mo) x-=mo; else if(x<0) x+=mo;}
inline void mod(ll &x) {if(x>=mo) x-=mo; else if(x<0) x+=mo;}
bool notp[N]; int p[N/10], mu[N], lp[N], si[N];
void sieve(int n) {
mu[1]=1; si[1]=1;
for(int i=2; i<=n; i++) {
if(!notp[i]) p[++p[0]] = i, mu[i] = -1, si[i] = lp[i] = 2;
for(int j=1; j <= p[0] && i*p[j] <= n; j++) {
int t = i*p[j];
notp[t] = 1;
if(i%p[j] == 0) {
mu[t] = 0;
lp[t] = lp[i] + 1;
si[t] = si[i] / lp[i] * lp[t];
break;
}
mu[t] = -mu[i];
lp[t] = 2;
si[t] = si[i] * 2;
}
mu[i] += mu[i-1];
si[i] += si[i-1];
}
} namespace ha {
const int p = 1001001;
struct ha {
struct meow{int ne, val, r;} e[10000];
int cnt, h[p];
ha() {cnt=0; memset(h, 0, sizeof(h));}
inline void insert(int x, int val) {
int u = x%p;
for(int i=h[u];i;i=e[i].ne) if(e[i].r == x) return;
e[++cnt] = (meow){h[u], val, x}; h[u] = cnt;
}
inline int quer(int x) {
int u = x%p;
for(int i=h[u];i;i=e[i].ne) if(e[i].r == x) return e[i].val;
return -1;
}
} hs, hu;
} using ha::hs; using ha::hu; int dj_u(int n) {
if(n <= U) return mu[n];
if(hu.quer(n) != -1) return hu.quer(n);
int ans = 1, r;
for(int i=2; i<=n; i=r+1) {
r = n/(n/i);
mod(ans -= (r-i+1) * dj_u(n/i) %mo);
}
hu.insert(n, ans);
return ans;
} int dj_s(int n) {
if(n <= U) return si[n];
if(hs.quer(n) != -1) return hs.quer(n);
int ans = n, r, now, last = dj_u(1);
for(int i=2; i<=n; i=r+1, last=now) {
r = n/(n/i); now = dj_u(r);
mod(ans -= (ll) (now - last) * dj_s(n/i) %mo);
}
hs.insert(n, ans);
return ans;
} int solve(int n) {
dj_u(n); dj_s(n);
int ans=0, r, last=0, now;
for(int i=1; i<=n; i=r+1, last=now) {
r = n/(n/i); now = dj_u(r); ll t = dj_s(n/i); //printf("hi [%d, %d] %d %d %lld\n", i, r, now, last, t);
mod(ans += (ll) (now - last) * t %mo * t %mo);
}
return ans;
} int main() {
freopen("in", "r", stdin);
int n=read(); //U = pow(n, 2.0/3);
sieve(U);
printf("%d", solve(n));
}

BZOJ 4176: Lucas的数论 [杜教筛]的更多相关文章

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

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

  2. [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∑N​j=1∑N​d(ij) ...

  3. bzoj4176. Lucas的数论 杜教筛

    题意:求\(\sum_{i=1}^n\sum_{j=1}^nd(ij),d是约数个数函数\) 题解:首先有一个结论\(d(ij)=\sum_{x|i}\sum_{y|j}[(i,j)==1]\) 那么 ...

  4. 【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+ ...

  5. bzoj 4176 Lucas的数论

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

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

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

  7. BZOJ 4176 Lucas的数论 莫比乌斯反演+杜教筛

    题意概述:求,n<=10^9,其中d(n)表示n的约数个数. 分析: 首先想要快速计算上面的柿子就要先把d(ij)表示出来,有个神奇的结论: 证明:当且仅当a,b没有相同的质因数的时候我们统计其 ...

  8. bzoj 4176: Lucas的数论【莫比乌斯反演+杜教筛】

    首先由这样一个结论: \[ d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1] \] 然后推反演公式: \[ \sum_{i=1}^{n}\sum_{j=1}^{n}\su ...

  9. ●BZOJ 4176 Lucas的数论

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4176 题解: 莫比乌斯反演,杜教筛 首先有这么一个结论: 令d(n)表示n的约数的个数(就是 ...

随机推荐

  1. [学习OpenCV攻略][005][视频播放控制]

    cvSetCaptureProperty(视频,属性,属性值) 设置视频的属性,属性可以是宏CV_CAP_PROP_POS_FRAMES 视频帧的位置 cvGetCaptureProperty(视频, ...

  2. Dev中GridControl的GridView 基本样式设置

    基本样式图: 代码如下: /// <summary> /// gridView样式 /// </summary> /// <param name="gdv&qu ...

  3. 转:C++与JAVA语言区别

    转自:http://club.topsage.com/thread-265349-1-1.html Java并不仅仅是C++语言的一个变种,它们在某些本质问题上有根本的不同: (1)Java比C++程 ...

  4. javascript 之继承-15

    继承 所谓继承就是子类继承父类的特征与行为,使得子类对象具与父类相同的行为.但是javascript 是没有class.抽象类.接口等抽象概念,javascript 只有对象,那么js中是如何让对象与 ...

  5. DOM解析原理示意

    DOM解析原理示意  

  6. memcached经典问题和现象

    缓存刷新时间集中问题 某个缓存失效了,导致其他节点的缓存命中率下降, 缓存中缺失的数据 去数据库查询.短时间内,会造成数据库服务器崩溃 需要将缓存失效时间离散分布在访问量比较低的时间段 multige ...

  7. thinkPHP内置字符串截取msubstr函数用法详解

    作者:陈达辉 字体:[增加 减小] 类型:转载 时间:2016-11-15 我要评论 这篇文章主要介绍了thinkPHP内置字符串截取函数用法,结合实例形式分析了thinkPHP内置的字符串截取函数功 ...

  8. PHP面试题:HTTP中POST、GET、PUT、DELETE方式的区别

    HTTP定义了与服务器交互的不同的方法,最基本的是POST.GET.PUT.DELETE,与其比不可少的URL的全称是资源描述符,我们可以这样理解:url描述了一个网络上资源,而post.get.pu ...

  9. JVM内存划分简介

    参考:深入理解JAVA虚拟机(第二版)

  10. Linux - ubuntu 16 打开SSH服务

    ubuntu 16 打开SSH服务 1.查看是否启动进程 roott@jiqing-virtual-machine:~# ps -ef | grep sshd root 3477 1 0 18:36 ...