[51nod1238] 最小公倍数之和 V3(杜教筛)
题面
传送门
题解
懒了……这里写得挺好的……
//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define IT map<ll,int>::iterator
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
const int N=6e6+5,P=1e9+7,inv2=500000004,inv6=166666668;
bitset<N>vis;int p[N],phi[N],g[N],m,sqr;ll n;map<ll,int>mp;
inline int calc(R int x){return (1ll*x*(x+1)>>1)%P;}
inline int calc2(R int x){return 1ll*x*(x+1)%P*((x<<1)+1)%P*inv6%P;}
inline int calc3(R int x){x=calc(x);return 1ll*x*x%P;}
void init(int n){phi[1]=g[1]=1;fp(i,2,n){if(!vis[i])p[++m]=i,phi[i]=i-1,g[i]=1ll*phi[i]*i%P*i%P;for(R int j=1,k;j<=m&&1ll*i*p[j]<=n;++j){vis[k=i*p[j]]=1;if(i%p[j]==0){phi[k]=phi[i]*p[j],g[k]=1ll*phi[k]*k%P*k%P;break;}phi[k]=phi[i]*(p[j]-1),g[k]=1ll*g[i]*g[p[j]]%P;}}fp(i,2,n)(g[i]+=g[i-1])%=P;
}
int G(ll n){if(n<=sqr)return g[n];IT it=mp.find(n);if(it!=mp.end())return it->second;int res=calc3(n%P),las=1,now;for(ll i=2,j;i<=n;i=j+1)j=n/(n/i),now=calc2(j%P),res=(res-1ll*(now-las+P)*G(n/i)%P+P)%P,las=now;return mp[n]=res;
}
int main(){
// freopen("testdata.in","r",stdin);scanf("%lld",&n),init(sqr=N-5);int res=0,las=0,now=0;for(R ll i=1,j;i<=n;i=j+1)j=n/(n/i),now=calc(j%P),(res+=1ll*(now-las+P)*G(n/i)%P)%=P,las=now;printf("%d\n",res);return 0;
}
转载于:https://www.cnblogs.com/bztMinamoto/p/10437280.html
[51nod1238] 最小公倍数之和 V3(杜教筛)相关推荐
- 51NOD 1220 约数之和(杜教筛)
1220 约数之和 推式子 ∑i=1n∑j=1nd(i,j)=∑i=1n∑j=1n∑x∣i∑y∣j(gcd(x,y)=1)xjy=∑d=1ndμ(d)∑i=1nd∑x∣iix∑j=1nd∑y∣jj=∑ ...
- 51nod1238 最小公倍数之和 V3
又被这神仙题给坑爆了. 神仙题解. 一开始我把lcm变成ij/gcd然后按照常规套路去推,推到最后发现不是miu * Id而是miu · Id......这还搞鬼啊. 正解居然跟这个差不多,先转成求其 ...
- 51nod1238. 最小公倍数之和 V3(数论)
题目链接 https://www.51nod.com/Challenge/Problem.html#!#problemId=1238 题解 本来想做个杜教筛板子题结果用另一种方法过了...... 所谓 ...
- [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 ...
- [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) ...
- 51nod1238(杜教筛)
这个题暴露出杜教筛还是没掌握好.. 然后就是讨论一个常见的求和 然后原式就能化简成 然后窝就天真的吧这个和式拿去做杜教筛了...然而这个和式的一个问题是函数也是个和式,其卷积实在是难求,所以推到一半推 ...
- 51 NOD 1227 平均最小公倍数(杜教筛)
1227 平均最小公倍数 推式子 S(n)=∑i=1n∑j=1ilcm(i,j)i=∑i=1n∑j=1iijigcd(i,j)=∑i=1n∑j=1ijgcd(i,j)=∑i=1n∑d=1i∑j=1ij ...
- 51nod 1220 约数之和【莫比乌斯反演+杜教筛】
首先由这样一个式子:\( d(ij)=\sum_{p|i}\sum_{q|j}[gcd(p,q)==1]\frac{pj}{q} \)大概感性证明一下吧我不会证 然后开始推: \[ \sum_{i=1 ...
- 【51nod】1239 欧拉函数之和 杜教筛
[题意]给定n,求Σφ(i),n<=10^10. [算法]杜教筛 [题解] 定义$s(n)=\sum_{i=1}^{n}\varphi(i)$ 杜教筛$\sum_{i=1}^{n}(\varph ...
最新文章
- JNI调用native方法出现 java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()异常的解决办法
- linux64平台上编译32位程序: GCC编译选项 -m64 -m32 -mx32
- ADO.NET中异步处理的方式
- linux通用中断子系统介绍
- R语言应用实战-基于R的C4.5算法和C5.0算法原理解析及应用案例
- c++静态库和动态库
- Linux终端打开一只小马,Linux 终端上的漂亮小马
- 真实收货地址大全2016_中国古典诗词大全汇集了诗经、唐诗、宋词、元曲以及纳兰词,12册精美套装。...
- javascript 对象(四)
- Day1通信基本概念 通信系统模型 通信系统分类与通信方式
- Verilog——7段数码管译码器
- Markdown必备,Lsky-pro图床配置
- 阿里云服务器ECS-Apollo搭建MQTT服务器(Windows环境)
- IIB接收SAP请求配置
- 布袋除尘器过滤风速多少_布袋除尘器过滤风速的选择!
- windows 7正版才是王道
- linux卸载k8s,K8S镜像删除及环境清理
- Qt --实现语音读文字功能
- 陌陌宣布改名“挚文集团”:旗下现有 App 名称保持不变
- 上海科技大学和南方科技大学计算机,你相信吗?这几所大学,20年后不比北大清华差...
热门文章
- 迭代var()内置函数的时候出现RuntimeError: dictionary changed size during iteration的解决办法...
- Chapter 9:Noise-Estimation Algorithms
- Java中String、StringBuffer和StringBuilder的区别
- 网民网上购物决策时间延长
- 各种flash的不同
- socket编程实践
- java期_java日期 时间
- eselasticsearch入门_ElasticSearch入门学习-基础示例(1)
- Python是世界上最好的语言,你不服不行!(附资料)
- python语音转文字源码_【python3】Python十行代码搞定文字转语音