原题链接

最近被51NOD的数论题各种刷……(NOI快到了我在干什么啊!

然后发现这题在网上找不到题解……那么既然A了就来骗一波访问量吧……

(然而并不怎么会用什么公式编辑器,写得丑也凑合着看吧……

$$
ANS=\sum_{i=1}^{n}\sum_{j=1}^{n} \frac{i*j}{gcd(i,j)}
$$
$$
=\sum_{d=1}^{n} d*\sum_{i=1}^{\left\lfloor\frac{n}{d}\right\rfloor} \sum_{j=1}^{\left\lfloor\frac{n}{d}\right\rfloor} i*j*[gcd(i,j)==1]
$$
$$
=\sum_{d=1}^{n} d*\sum_{d'=1}^{\left\lfloor\frac{n}{d}\right\rfloor} f(\left\lfloor\frac{n}{d*d'}\right\rfloor)*d'^2*μ(d')
$$
$$
=\sum_{d'=1}^{n} d'^2*μ(d')*\sum_{d=1}^{\left\lfloor\frac{n}{d'}\right\rfloor} d*f(\left\lfloor\frac{n}{d*d'}\right\rfloor)
$$

这里$f(x)=(\frac{x*(x+1)}{2})^2$,即1到x中数字之间两两乘积之和。

可以看出不同的$\left\lfloor\frac{n}{d'}\right\rfloor$只有根号n个,对于某一个$\left\lfloor\frac{n}{d'}\right\rfloor$,不同的$\left\lfloor\frac{n}{d*d'}\right\rfloor$也只有根号n个,那么把它们压在一起处理就好了。

但是要做到这一点需要快速求出$d'^2*μ(d')$的前缀和,这时就要用上杜教筛了。

记$g(x)=x^2*μ(x)$,$S(x)=\sum_{i=1}^{x} g(i)$

那么

$  \sum_{i=1}^{n} \sum_{x|i} g(x)*(\frac{i}{x})^2$

$=\sum_{i=1}^{n}  i*\sum_{x|i} μ(x)$

$=\sum_{i=1}^{n} [i==1] $

$= 1$

同时

$  \sum_{i=1}^{n} \sum_{x|i} g(x)*(\frac{i}{x})^2$

$=\sum_{i=1}^{n} \sum_{x=1}^{[\frac{n}{i}]} g(x)*i^2$

$=\sum_{i=1}^{n} i^2*S[\frac{n}{i}]$

可以得到$S(n)=1-\sum_{i=2}^{n} i^2*S[\frac{n}{i}]$,预处理+哈希维护一波就行了

但是不知道是我常数太大,还是方法没别人优越,卡了很久常数才卡过去。

#include<ctime>
#include<cstdio>
#include<algorithm>
#define ll long long
#define N 1000001
#define K 500000004
using namespace std;
ll read_p,read_ca,read_f;
inline ll read(){read_p=0;read_ca=getchar();read_f=1;while(read_ca<'0'||read_ca>'9') {if (read_ca=='-') read_f=-1;read_ca=getchar();}while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar();return read_p*read_f;
}
const int HA=1e6+7;
const int MOD=1e9+7;
int MMH=0,p[N],num=0,mu[N],_ff[N],l[HA],Num,f[N],s[N],U=0;
ll n,P;
bool bo[N];
struct na{int z,ne;ll y;}b[HA];
inline void M(int &x){while (x>=MOD) x-=MOD;while(x<0)x+=MOD;}
inline ll MM(ll x){return x<MOD&&x>-MOD?x:x%MOD;}
inline void in(int x,ll y,int z){b[++Num].y=y;b[Num].z=z;b[Num].ne=l[x];l[x]=Num;}
inline int _f(ll x){if (x>MOD) x%=MOD;if (x<N) return _ff[x];return MM(1LL*x*(x+1)>>1);
}
inline ll sqr(ll x){return x*x%MOD;}
inline int F(ll x){int MMH=0;ll P;for (register ll i=1,j;i<=x;i=j+1) j=x/(P=x/i),M(MMH+=MM(sqr(_f(P))*(_f(j)-_f(i-1))));return MMH;
}
inline int Q(ll x){if (x>MOD) x%=MOD;return MM(MM(x*(x+1))*(x+x+1))*166666668%MOD;}
inline int mmh(ll x){if (x<N) return s[x];register ll i,j;ll P;int o;for (i=l[o=x%HA];i;i=b[i].ne) if (b[i].y==x) return b[i].z;int MMH=0;for (i=2;i<=x;i=j+1) j=x/(P=x/i),M(MMH=MM(1LL*(Q(j)-Q(i-1))*mmh(P)+MMH));M(MMH=1-MMH);in(o,x,MMH);return MMH;
}
int main(){register int i,j;mu[1]=1;for (i=2;i<N;i++){if (!bo[i]) p[++num]=i,mu[i]=-1;for (j=1;j<=num&&i*p[j]<N;j++){bo[i*p[j]]=1;if (i%p[j]) mu[i*p[j]]=-mu[i];else {mu[i*p[j]]=0;break;}}}for (i=1;i<N;i++) M(f[i]=1LL*i*i*mu[i]%MOD+MOD),M(s[i]=s[i-1]+f[i]),_ff[i]=MM(1LL*i*(i+1)>>1);n=read();for (ll i=1,j;i<=n;i=j+1) j=n/(P=n/i),M(MMH+=MM(1LL*(mmh(j)-mmh(i-1))*F(P)));printf("%d\n",MMH);
}

View Code

转载于:https://www.cnblogs.com/Enceladus/p/5655267.html

51 NOD 1238 最小公倍数之和 V3相关推荐

  1. [51 nod 1238] 最小公倍数之和 V3(杜教筛)

    1238 最小公倍数之和 V3 推式子 ∑i=1n∑j=1nlcm(i,j)=∑i=1n∑j=1nijgcd(i,j)=∑d=1n∑i=1n∑j=1nijd(gcd(i,j)==d)=∑d=1nd∑i ...

  2. 51 NOD 1363 最小公倍数之和 (欧拉函数思维应用)

    1363 最小公倍数之和 推式子 ∑i=1nlcm(i,n)=n∑i=1nigcd(i,n)=n∑d∣n∑i=1nid(gcd(i,n)==d)=n∑d∣n∑i=1ndi(gcd(i,nd)==1)= ...

  3. 51nod 1238 最小公倍数之和 V3

    背景: luogu P1829 \text{luogu P1829 }luogu P1829 [国家集训队]Crash的数字表格 / JZPTAB的加强版. 题目传送门: http://www.51n ...

  4. 51nod1238 最小公倍数之和 V3

    又被这神仙题给坑爆了. 神仙题解. 一开始我把lcm变成ij/gcd然后按照常规套路去推,推到最后发现不是miu * Id而是miu · Id......这还搞鬼啊. 正解居然跟这个差不多,先转成求其 ...

  5. 51nod1238. 最小公倍数之和 V3(数论)

    题目链接 https://www.51nod.com/Challenge/Problem.html#!#problemId=1238 题解 本来想做个杜教筛板子题结果用另一种方法过了...... 所谓 ...

  6. [51nod1238] 最小公倍数之和 V3(杜教筛)

    题面 传送门 题解 懒了--这里写得挺好的-- //minamoto #include<bits/stdc++.h> #define R register #define ll long ...

  7. 51 nod 最大公约数之和 (求1~n里面各个数的gcd和 n=1000000)

    Description 小菜的妹妹小诗就要读小学了!正所谓计算机要从娃娃抓起,小菜决定在幼儿园最后一段轻松的时间里教妹妹编程. 小菜刚教完gcd即最大公约数以后,一知半解的妹妹写了如下一段代码:sum ...

  8. [51 nod 123] 最大公约数之和 V3(杜教筛)

    1237 最大公约数之和 V3 推式子 ∑i=1n∑j=1ngcd(i,j)=∑d=1nd∑i=1n∑j=1n(gcd(i,j)==d)=∑d=1nd∑i=1nd∑j=1nd(gcd(i,j)==1) ...

  9. 51 nod 1405 树的距离之和

    1405 树的距离之和 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给定一棵无根树,假设它有n个节点,节点编号从1到n, 求任意两点之间的距离(最短路径)之和. ...

最新文章

  1. 关于 Git 提交这些规范,你都遵守了吗?
  2. JS实现Echarts的图表保存为图片功能
  3. FTPClient登录慢的问题
  4. 微软希望每个人有自己的人工智能朋友
  5. SpringBoot学习总结(个人笔记)
  6. Mysql 定时备份操作
  7. 【BZOJ5495】[十二省联考2019]异或粽子(主席树,贪心)
  8. 使用httpclient下载 页面、图片
  9. “科创中国”创新资源共享平台助力2020年“企业创新大家谈”活动
  10. kindle看pdf乱码_kindle阅读pdf中文乱码解决
  11. [渝粤教育] 西安建筑科技大学 环境规划与管理 参考 资料
  12. 空间线与空间平面之间的夹角关系
  13. 剖析数据结构线性表,代码实现,分文件编写
  14. 记一次修改DiyBox的经历(openwrt固件解包与打包)
  15. 去除数组中值为空的元素
  16. 全息投影技术未来的发展趋势
  17. wolframalpha最新版_wolfram alpha 安卓版下载
  18. android差分升级原理,BigNews Android 增量更新框架差分包升级 @codeKK c开源站
  19. “事件营销”不等于“活动营销”
  20. 北京楼市:一个打死都不说的秘密

热门文章

  1. (七) shiro 加密与解密
  2. mysql 密码忘记了怎么办? [仅msyql8版本]
  3. 单位阶跃信号是周期信号吗_集成墙板会影响手机信号吗?
  4. java中用字节流读取文本时中文乱码
  5. 【Nutch2.2.1源代码分析之5】索引的基本流程
  6. 【典型错误】The type java.lang.Object cannot be resolved.
  7. 本文把 TCP/IP 讲绝了
  8. spark中使用categoricalFeaturesInfo来标记分类型变量
  9. Hive 基础(2):库、表、字段、交互式查询的基本操作
  10. Hbase高级应用:建表高级属性、行键设计、设计原则、热点问题