题意:求\(\sum_{i=1}^n\sum_{j=1}^nd(ij),d是约数个数函数\)

题解:首先有一个结论\(d(ij)=\sum_{x|i}\sum_{y|j}[(i,j)==1]\)

那么\(\sum_{i=1}^n\sum_{j=1}^n\sum_{x|i}\sum_{y|j}\sum_{d|(i,j)}\mu(d)\)

枚举d,\(\sum_{i=1}^n\sum_{j=1}^n\sum_{d|i,d|j}\mu(d)d(\frac{i}{d})d(\frac{j}{d})=\sum_{d=1}^n\mu(d)\sum_{d|i}\sum_{d|j}d(\frac{i}{d})d(\frac{j}{d})=\sum_{d=1}^n\mu(d)\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}d(i)\sum_{j=1}^{\lfloor \frac{n}{d} \rfloor}d(j)\)

这里我们需要分块求\(\mu\)和\(d\)的前缀和,\(\mu\)很好求,对于d,我们考虑\(d=I*I\),考虑把杜教筛中的\(g(x)=\mu\),\(I*I*\mu=I*e=e\),那么\(S(n)=\sum_{i=1}^n1-\sum_{d=2}\mu(d)S(\lfloor \frac{n}{d} \rfloor)\)

//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize(4)
//#pragma GCC optimize("unroll-loops")
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<bits/stdc++.h>
#define fi first
#define se second
#define db double
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000007
#define ld long double
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
//#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define fin freopen("a.txt","r",stdin)
#define fout freopen("a.txt","w",stdout)
#define fio ios::sync_with_stdio(false);cin.tie(0)
template<typename T>
inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
template<typename T>
inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;} using namespace std; const double eps=1e-8;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int N=5000000+10,maxn=3000000+10,inf=0x3f3f3f3f; int prime[N],cnt;
ll d[N],num[N],mu[N];
bool mark[N];
map<ll,ll>dd,muu;
void init()
{
mu[1]=d[1]=1;
for(int i=2;i<N;i++)
{
if(!mark[i])prime[++cnt]=i,mu[i]=-1,d[i]=2,num[i]=1;
for(int j=1;j<=cnt&&i*prime[j]<N;j++)
{
mark[i*prime[j]]=1;
if(i%prime[j]==0)
{
mu[i*prime[j]]=0;
num[i*prime[j]]=num[i]+1;
d[i*prime[j]]=d[i]/num[i*prime[j]]*(num[i*prime[j]]+1);
break;
}
mu[i*prime[j]]=-mu[i];
d[i*prime[j]]=d[i]<<1;
num[i*prime[j]]=1;
}
}
for(ll i=1;i<N;i++)
{
add(d[i],d[i-1]);
mu[i]=(mu[i]+mod)%mod;
add(mu[i],mu[i-1]);
}
}
ll getmu(ll n)
{
if(n<N)return mu[n];
if(muu.find(n)!=muu.end())return muu[n];
ll ans=1;
for(ll i=2,j;i<=n;i=j+1)
{
j=n/(n/i);
ll te=(j-i+1)%mod;
sub(ans,te*getmu(n/i)%mod);
}
return muu[n]=ans;
}
ll getd(ll n)
{
if(n<N)return d[n];
if(dd.find(n)!=dd.end())return dd[n];
ll ans=n%mod;
for(ll i=2,j;i<=n;i=j+1)
{
j=n/(n/i);
ll te=(getmu(j)-getmu(i-1)+mod)%mod;
sub(ans,te*getd(n/i)%mod);
}
return dd[n]=ans;
}
int main()
{
init();
ll n;scanf("%lld",&n);
ll ans=0;
for(ll i=1,j;i<=n;i=j+1)
{
j=n/(n/i);
ll te=(getmu(j)-getmu(i-1)+mod)%mod;
add(ans,te*getd(n/i)%mod*getd(n/i)%mod);
}
printf("%lld\n",ans);
return 0;
}
/******************** ********************/

bzoj4176. Lucas的数论 杜教筛的更多相关文章

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

  2. BZOJ 4176: Lucas的数论 [杜教筛]

    4176: Lucas的数论 题意:求\(\sum_{i=1}^n \sum_{j=1}^n \sigma_0(ij)\) \(n \le 10^9\) 代入\(\sigma_0(nm)=\sum_{ ...

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

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

  4. [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) ...

  5. 【XSY2731】Div 数论 杜教筛 莫比乌斯反演

    题目大意 定义复数\(a+bi\)为整数\(k\)的约数,当且仅当\(a\)和\(b\)为整数且存在整数\(c\)和\(d\)满足\((a+bi)(c+di)=k\). 定义复数\(a+bi\)的实部 ...

  6. BZOJ3944 Sum 数论 杜教筛

    原文链接http://www.cnblogs.com/zhouzhendong/p/8671759.html 题目传送门 - BZOJ3944 题意 多组数据(组数<=10). 每组数据一个正整 ...

  7. UOJ#221. 【NOI2016】循环之美 数论,杜教筛

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ221.html 题解 首先把题目转化为求 \[\sum_{x=1}^n \sum_{y=1}^m [\gcd(x,y) = ...

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

    Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i< ...

  9. BZOJ4176 Lucas的数论 【莫比乌斯反演 + 杜教筛】

    题目 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i<=N", ...

随机推荐

  1. Java中sort实现降序排序

    利用Collections的reverseOrder方法: import java.util.Arrays; import java.util.Collections; public class Ma ...

  2. Yarn 的日志聚集功能配置使用

    需要  hadoop 的安装目录/etc/hadoop/yarn-site.xml 中进行配置 配置内容 <property> <name>yarn.log-aggregati ...

  3. Dispose in c#

    在标准的Dispose模式中,真正的IDisposable接口的Dispose方法并没有做实际的清理工作,它其实是调用了下面的这个带bool参数且受保护的的虚方法: protected virtual ...

  4. 用Qemu模拟vexpress-a9 --- 配置 qemu 的网络功能

    转载:http://wiki.sylixos.com/index.php/Linux%E7%8E%AF%E5%A2%83%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97 环境介 ...

  5. 在C#中理解和实现策略模式的绝对入门教程

    介绍 本文的目的是理解战略模式的基础知识,并试图了解何时可以使用,并有一个基本的实现,以便更好地理解.在现实世界的应用中,这是无法实施战略模式的,所采用的例子也远没有实际可行.这篇文章的想法只是为了说 ...

  6. 转 代码修改buildoption

    using System;using System.IO;using UnityEditor;using UnityEngine; public class BuildPlayer : Scripta ...

  7. sublime3 mac : Package Control There are no packages available for installation

    如下问题: 查看控制台:点击 ctrl+`打开控制台 发现是因为http://packagecontrol.io/channel_v3.json 获取失败,手动下载channel_v3.json文件, ...

  8. mysql5.7.23手动配置安装windows版

    1.mysql下载地址 官网:https://dev.mysql.com/downloads/mysql/5.7.html#downloads 官网我下载的是: 百度网盘:链接: https://pa ...

  9. Wiener’s attack python

    题目如下: 在不分解n的前提下,求d. 给定: e = 140586954170153340715880103465867497905399132874997078029388987191993846 ...

  10. linux网络常用命令

    1,显示网桥 brctl show2,显示ip ip a3,查看openvswitch的配置信息 ovs-vsctl show4,显示网络命名空间 ip netns5,显示DHCP信息 ps -ef ...