51nod 1238 最小公倍数之和 V3
来源:互联网 发布:禅道的数据库配置 编辑:程序博客网 时间:2024/06/05 11:57
我们首先计算
于是
我们只需要杜教筛求出
因此
求出
#include<cstdio>#include<cmath>#include<algorithm>using namespace std;#define LL long longconst int p=1000000007,maxn=5000010,mod=1000007,inv2=500000004,inv6=166666668;int phi[maxn],prm[maxn],sum[maxn],tot,m;LL n;/*void pause(){ int x; x=1;}*/int inc(int x,int y){ x+=y; return x>=p?x-p:x;}int dec(int x,int y){ x-=y; return x<0?x+p:x;}struct hashset{ int fir[mod+10],ne[mod*5],ans[mod*5],tot; LL val[mod*5]; int find(LL n) { for (int i=fir[n%mod];i;i=ne[i]) if (val[i]==n) return ans[i]; return -1; } void ins(LL n,int x) { if (tot>mod*5-5) return; int y=n%mod; ne[++tot]=fir[y]; fir[y]=tot; val[tot]=n; ans[tot]=x; }}h;int sum1(LL n){ n%=p; return n*inc(n,1)%p*inv2%p;}int sum2(LL n){ n%=p; return n*inc(n,1)%p*inc(inc(n,n),1)%p*inv6%p;}int sum3(LL n){ int x=sum1(n); return (LL)x*x%p;}int calc(LL n){ if (n<=m) return sum[n]; int ret=h.find(n),ans,x,y; if (ret!=-1) return ret; ans=sum3(n); for (LL i=2,j;i<=n;i=j+1) { //if (n==10000000000LL&&j==3333333333LL) pause(); j=n/(n/i); x=dec(sum2(j),sum2(i-1)); y=calc(n/i); ans=dec(ans,(LL)x*y%p); //if (x<0||y<0||ans<0) printf("no:%lld,%lld,%lld\n",n,i,j); } h.ins(n,ans); return ans;}int main(){ int ans=0,x,y; scanf("%lld",&n); m=pow(n,2.0/3); //m=100; phi[1]=sum[1]=1; for (int i=2;i<=m;i++) { if (!phi[i]) { prm[++tot]=i; phi[i]=i-1; } for (int j=1;j<=tot&&(LL)i*prm[j]<=m;j++) if (i%prm[j]) phi[i*prm[j]]=phi[i]*(prm[j]-1); else { phi[i*prm[j]]=phi[i]*prm[j]; break; } sum[i]=inc(sum[i-1],(LL)phi[i]*i%p*i%p); } for (LL i=1,j;i<=n;i=j+1) { j=n/(n/i); x=inc(dec(calc(j),calc(i-1)),i==1); y=sum1(n/i); ans=inc(ans,(LL)x*y%p); } printf("%d\n",dec(ans,sum1(n)));}
阅读全文
0 0
- [杜教筛] 51Nod 1238 最小公倍数之和 V3
- 【51NOD 1238】最小公倍数之和 V3
- 51nod 1238 最小公倍数之和 V3
- 51nod 1238 最小公倍数之和 V3
- 51Nod-1238-最小公倍数之和 V3
- 51nod 1238 最小公倍数之和 V3
- [数论][莫比乌斯反演][杜教筛] 51Nod 1238 最小公倍数之和 V3
- 【51nod1238】 最小公倍数之和 V3
- 51nod1238 最小公倍数之和V3
- 51 nod 1363 最小公倍数之和
- 【51Nod 1363】最小公倍数之和
- 51nod 1363 最小公倍数之和
- 51Nod-1363-最小公倍数之和
- 最小公倍数之和 V2 51Nod
- 51nod1238 最小公倍数之和 V3
- [杜教筛] 51nod1238. 最小公倍数之和 V3
- 【51nod 1190】最小公倍数之和 V2
- 51nod 1190 最小公倍数之和V2
- Go封装操作数据库
- linux中启动redis后,无法使用RedisDesktopManager连接
- Java代理模式 静态代理,动态代理,Cglib代理
- IDEA编译smalidea源码
- (一)Windows下tensorflow安装 win64+Python3.5
- 51nod 1238 最小公倍数之和 V3
- cocos2d-x 3.10 开发环境搭建及VS安装各种坑
- Java基础篇《1》--数据类型
- 在tp中数据去重并获取自定义字段
- 初2019级编程社团期末考试(20170610)-第一题解题报告
- linux下docker安装与使用 1
- 根据IP地址获取用户的MAC地址
- java数据库工具类
- python学习之if __name__ == 'main': 的作用和原理