首先由这样一个式子:\( d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1]\frac{pj}{q} \)大概感性证明一下吧我不会证

然后开始推:

\[\sum_{i=1}^{n}\sum_{j=1}^{n}\sum_{p|i}\sum_{q|j}[gcd(p,q)==1]\frac{pj}{q}
\]

\[\sum_{p=1}^{n}\sum_{q=1}^{n}[gcd(p,q)==1]\sum_{p|i}\sum_{q|j}\frac{pj}{q}
\]

\[\sum_{p=1}^{n}p\sum_{q=1}^{n}[gcd(p,q)==1]\left \lfloor \frac{n}{p} \right \rfloor\sum_{j=1}^{\left \lfloor \frac{n}{q} \right \rfloor}j
\]

方便起见设\( f(n)=\sum_{i=1}^{n}i \)

\[\sum_{p=1}^{n}p\sum_{q=1}^{n}\sum_{k|p,k|q}\mu(k)\left \lfloor \frac{n}{p} \right \rfloor f(\left \lfloor \frac{n}{q} \right \rfloor)
\]

\[\sum_{k=1}^{n}\mu(k)\sum_{k|p}p\left \lfloor \frac{n}{p} \right \rfloor\sum_{k|q}f(\left \lfloor \frac{n}{q} \right \rfloor)
\]

\[\sum_{k=1}^{n}\mu(k)\sum_{i=1}^{\left \lfloor \frac{n}{k} \right \rfloor}ik\left \lfloor \frac{n}{ik} \right \rfloor\sum_{j=1}^{\left \lfloor \frac{n}{k} \right \rfloor}f(\left \lfloor \frac{n}{jk} \right \rfloor)
\]

\[\sum_{k=1}^{n}\mu(k)k\sum_{i=1}^{\left \lfloor \frac{n}{k} \right \rfloor}i\left \lfloor \frac{n}{ik} \right \rfloor\sum_{j=1}^{\left \lfloor \frac{n}{k} \right \rfloor}f(\left \lfloor \frac{n}{jk} \right \rfloor)
\]

这个样子显然可以用杜教筛了,但是注意到后面有两个求和式,可能会增大常数(但是也不会T啦),所以考虑这两个求和式的关系:

\[\sum_{i=1}^{n}f(\left \lfloor \frac{n}{i} \right \rfloor)
\]

\[=\sum_{i=1}^{n}\sum_{j=1}^{\left \lfloor \frac{n}{i} \right \rfloor}j
\]

\[=\sum_{i=1}^{n}\sum_{j=1}^{\left \lfloor \frac{n}{i} \right \rfloor}j
\]

\[=\sum_{j=1}^{n}j\left \lfloor \frac{n}{j} \right \rfloor
\]

所以这两个式子是一样的!于是就变成了:

\[\sum_{k=1}^{n}\mu(k)k(\sum_{j=1}^{\left \lfloor \frac{n}{k} \right \rfloor}f(\left \lfloor \frac{n}{jk} \right \rfloor))^2
\]

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. using namespace std;
  5. const int N=1000005,inv2=500000004,mod=1e9+7;
  6. int m,mb[N],q[N],tot;
  7. long long n,s[N],ans,ha[N];
  8. bool v[N];
  9. long long slv(long long n)
  10. {
  11. return n*(n+1)%mod*inv2%mod;
  12. }
  13. long long wk(long long x)
  14. {
  15. if(x<=m)
  16. return s[x];//cout<<x<<endl;
  17. if(ha[n/x])
  18. return ha[n/x];
  19. long long re=1ll;
  20. for(int i=2,la;i<=x;i=la+1)
  21. {
  22. la=x/(x/i);
  23. re=(re-(slv(la)-slv(i-1))*wk(x/i)%mod)%mod;
  24. }
  25. return ha[n/x]=re;
  26. }
  27. long long clc(long long n)
  28. {
  29. long long re=0ll;
  30. for(int i=1,la;i<=n;i=la+1)
  31. {
  32. la=n/(n/i);
  33. re=(re+(la-i+1)*slv(n/i)%mod)%mod;
  34. }
  35. return re;
  36. }
  37. int main()
  38. {
  39. scanf("%lld",&n);
  40. m=(int)ceil(pow((int)n,2.0/3));
  41. mb[1]=1;
  42. for(int i=2;i<=m;i++)
  43. {
  44. if(!v[i])
  45. {
  46. q[++tot]=i;
  47. mb[i]=-1;
  48. }
  49. for(int j=1;j<=tot&&q[j]*i<=m;j++)
  50. {
  51. int k=i*q[j];
  52. v[k]=1;
  53. if(i%q[j]==0)
  54. {
  55. mb[k]=0;
  56. break;
  57. }
  58. mb[k]=-mb[i];
  59. }
  60. }
  61. for(int i=1;i<=m;i++)
  62. s[i]=(s[i-1]+i*mb[i])%mod;
  63. //cout<<wk(102)<<" "<<wk(101)<<endl;
  64. for(int i=1,la;i<=n;i=la+1)
  65. {
  66. la=n/(n/i);
  67. long long ml=clc(n/i);//if(i!=1)cout<<i-1<<" "<<n/(i-1)<<endl<<la<<" "<<n/la<<endl;
  68. ans=(ans+(wk(la)-wk(i-1))*ml%mod*ml%mod)%mod;
  69. }
  70. printf("%lld",(ans%mod+mod)%mod);
  71. return 0;
  72. }

51nod 1220 约数之和【莫比乌斯反演+杜教筛】的更多相关文章

  1. 51NOD 1222 最小公倍数计数 [莫比乌斯反演 杜教筛]

    1222 最小公倍数计数 题意:求有多少数对\((a,b):a<b\)满足\(lcm(a,b) \in [1, n]\) \(n \le 10^{11}\) 卡内存! 枚举\(gcd, \fra ...

  2. [复习]莫比乌斯反演,杜教筛,min_25筛

    [复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...

  3. 【bzoj3930】[CQOI2015]选数 莫比乌斯反演+杜教筛

    题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一 ...

  4. [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)

    [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...

  5. 51nod 1237 最大公约数之和 V3【欧拉函数||莫比乌斯反演+杜教筛】

    用mu写lcm那道卡常卡成狗(然而最后也没卡过去,于是写一下gcd冷静一下 首先推一下式子 \[ \sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j) \] \[ \sum_{i= ...

  6. 51Nod.1237.最大公约数之和 V3(莫比乌斯反演 杜教筛 欧拉函数)

    题目链接 \(Description\) \(n\leq 10^{10}\),求 \[\sum_{i=1}^n\sum_{j=1}^ngcd(i,j)\ mod\ (1e9+7)\] \(Soluti ...

  7. 牛客练习赛84F-牛客推荐系统开发之下班【莫比乌斯反演,杜教筛】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/11174/F 题目大意 给出\(n,k\)求 \[\sum_{i_1=1}^n\sum_{i_2=1}^n.. ...

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

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

  9. 【CCPC-Wannafly Winter Camp Day3 (Div1) F】小清新数论(莫比乌斯反演+杜教筛)

    点此看题面 大致题意: 让你求出\(\sum_{i=1}^n\sum_{j=1}^n\mu(gcd(i,j))\). 莫比乌斯反演 这种题目,一看就是莫比乌斯反演啊!(连莫比乌斯函数都有) 关于莫比乌 ...

随机推荐

  1. hdu 1429 bfs+二进制状态压缩

    开始时候只用了BFS,显然超时啊,必然在结构体里加一个数组什么的判重啊,开始用的一个BOOL数组,显然还是不行,复杂度高,每次都要遍历数组来判重:后百度之,学习了二进制状态压缩,其实就用一个二进制数来 ...

  2. IText 生成pdf,处理table cell列跨页缺失的问题

    /**     * 创建(table)PDF,处理cell 跨页处理     * @param savePath(需要保存的pdf路径)     * @param pmbs (数据库查询的数据)    ...

  3. 从零开始写STL—set/map

    这一部分只要把搜索树中暴露的接口封装一下,做一些改动. set源码剖析 template<typename T> class set { public: typedef T key_typ ...

  4. 钱币兑换问题---hdu1284(完全背包)

    Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法.请你编程序计算出共有多少种兑法.   Input 每行只有一个正整数N,N小于32768.   ...

  5. Oracle计算时间差

    Oracle计算时间差表达式 --获取两时间的相差豪秒数 select ceil((To_date('2008-05-02 00:00:00' , 'yyyy-mm-dd hh24-mi-ss') - ...

  6. 如何使用sqlalchemy获取某年某月的数据总和

    代码如下: # 基于Flask的SQLAlchemy # models class History(db.Model): __tablename__ = 'historys' id = db.Colu ...

  7. 使用datatables实现后台分页功能,减轻前端渲染压力

    注意不同版本,参数名字及参数内容存在差异,具体可以参考https://datatables.net/upgrade/1.10-convert#Options 控制页面显示的参数:https://dat ...

  8. Nginx: 解决connect() to xxxx failed (13: Permission denied) while connecting to upstream的问题

    一句话:setsebool httpd_can_network_connect true

  9. 【scrapy】Item及Spider

    Items Item objects are simple containers used to collect the scraped data.They provide a dictionary- ...

  10. HTML的DIV如何实现水平居中

    内部的DIV必须有下面两行代码即可 text-align:center; margin:0 auto;   在IE6中同样可以