[杜教筛] BZOJ4176. Lucas的数论
来源:互联网 发布:2017支付宝和淘宝解绑 编辑:程序博客网 时间:2024/06/05 19:00
陈老师R老师等式
反演一下就变成
后面的东西也分块求,复杂度证明跟杜教筛复杂度证明差不多
#include <cstdio>#include <iostream>#include <algorithm>#include <map>using namespace std;const int N=10000010,P=1000000007;int p[N],mu[N];map<int,int> S;inline int g(int n){ int ret=0; for(int i=1,j;i<=n;i=j+1){ j=n/(n/i); ret=(ret+1LL*(j-i+1)*(n/i))%P; } return 1LL*ret*ret%P;}int Sum(int n){ if(n<=1000000) return mu[n]; if(S.count(n)) return S[n]; int ret=1; for(int i=2,j;i<=n;i=j+1){ j=n/(n/i); ret=(ret-1LL*(j-i+1)*Sum(n/i))%P; } return S[n]=ret;}int n;inline void Pre(){ mu[1]=1; for(int i=2;i<=1000000 && i<=n;i++){ if(!p[i]) p[++*p]=i,mu[i]=-1; for(int j=1;j<=*p && 1LL*i*p[j]<=1000000 && 1LL*i*p[j]<=n;j++){ p[i*p[j]]=1; if(i%p[j]) mu[i*p[j]]=-mu[i]; else break; } } for(int i=1;i<=1000000 && i<=n;i++) mu[i]=(mu[i]+mu[i-1])%P;}int main(){ int ans=0; scanf("%d",&n); Pre(); for(int i=1,j,lst=0;i<=n;i=j+1){ j=n/(n/i); int cur=Sum(j); ans=(ans+1LL*(cur-lst)*g(n/i))%P; lst=cur; } printf("%d\n",(ans+P)%P); return 0;}
阅读全文
0 0
- [杜教筛] BZOJ4176. Lucas的数论
- bzoj4176 Lucas 的数论
- [bzoj4176]Lucas的数论
- bzoj4176 Lucas的数论 (杜教筛 +莫比乌斯反演)
- 【BZOJ 4176】 Lucas的数论 - 杜教筛
- 4176: Lucas的数论
- bzoj 4176 Lucas的数论
- BZOJ 4176 Lucas的数论
- [杜教筛 约数个数前缀和] BZOJ 4176 Lucas的数论
- 一道水题---lucas的数论
- bzoj 4176: Lucas的数论 (反演)
- BZOJ 4176: Lucas的数论 莫比乌斯反演 杜教筛
- lucas数论定理学习
- 数论 Lucas定理 hdu3037
- 数论--Lucas Theorem
- 数论总结之Lucas
- lucas (数论定理)
- BZOJ 4176 Lucas的数论 莫比乌斯反演
- Linux权限详解(chmod、600、644、666、700、711、755、777、4755、6755、7755)
- shitu
- 如使百度百科的通过率提升
- 重写java底层equals
- DbUtils
- [杜教筛] BZOJ4176. Lucas的数论
- Spring框架探究
- XIUGAI
- dir命令
- 键盘的使用
- 5.5.5 函数属性和方法
- centos low disk space问题
- AS配置NDK插件命令External Tools(javah/ndk-build/ndk-build clean)
- 中奖啦,公布 10 本书籍的中奖读者