【51Nod1227】平均最小公倍数-杜教筛
来源:互联网 发布:淘宝客为什么要用软件 编辑:程序博客网 时间:2024/06/05 10:36
测试地址:平均最小公倍数
做法:这一题需要用到杜教筛。这一题推式子的过程比较经典,是做杜教筛更难题的基础。
首先定义几个接下来要用到的符号和函数:
幂函数:
函数
函数
我们用公式表达要求的函数:
我们知道
注意到
我们发现这个式子已经有点积性函数的意思了,我们再用这个式子来算
那么
要求函数
看不懂上述式子的同学可以尝试从约数、倍数和贡献的方面来理解一下……
将
再结合这个式子:
这样就可以使用杜教筛来计算了,使用哈希表判重,再预处理前
以下是本人代码:
#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#define hashsize 5000000#define limit 1000000#define mod 1000000007#define ll long longusing namespace std;ll a,b,phi[limit+5],sum[limit+5],h[hashsize+5]={0},f[hashsize+5];bool prime[limit+5]={0};int hash(ll x){ ll s=x%hashsize; while(h[s]&&h[s]!=x) s=(s+1)%hashsize; return s;}void init(){ for(int i=1;i<=limit;i++) phi[i]=i; for(ll i=2;i<=limit;i++) if (!prime[i]) { for(ll j=1;i*j<=limit;j++) { prime[i*j]=1; phi[i*j]=phi[i*j]/i*(i-1); } } sum[0]=0; for(int i=1;i<=limit;i++) sum[i]=(sum[i-1]+i*phi[i])%mod;}ll gcd(ll a,ll b){ return (b==0)?a:gcd(b,a%b);}ll sum1(ll a,ll b){ return (b*(b+1)/2-a*(a-1)/2)%mod;}ll sum2(ll x){ ll a=x,b=x+1,c=2*x+1,s=6,g; g=gcd(a,s),a/=g,s/=g; g=gcd(b,s),b/=g,s/=g; g=gcd(c,s),c/=g,s/=g; return (((a*b)%mod)*c)%mod;}ll G(ll x){ if (x<=limit) return sum[x]; int pos=hash(x); if (h[pos]==x) return f[pos]; ll i=2,next,s=0; while(i<=x) { next=x/(x/i); s=(s+sum1(i,next)*G(x/i))%mod; i=next+1; } h[pos]=x,f[pos]=(sum2(x)-s+mod)%mod; return f[pos];}ll F(ll x){ ll i=1,next,s=0; while(i<=x) { next=x/(x/i); s=(s+(next-i+1)*G(x/i))%mod; i=next+1; } return (500000004*(s+x))%mod;}int main(){ init(); scanf("%lld%lld",&a,&b); printf("%lld",(F(b)-F(a-1)+mod)%mod); return 0;}
阅读全文
0 0
- 【51Nod1227】平均最小公倍数-杜教筛
- 51nod1227 平均最小公倍数
- [51nod1227]平均最小公倍数(莫比乌斯反演+杜教筛)
- [杜教筛] 51Nod 1227 平均最小公倍数
- 【51NOD 1227】平均最小公倍数
- 51Nod-1227-平均最小公倍数
- 51nod 1227 平均最小公倍数
- [杜教筛] 51Nod 1238 最小公倍数之和 V3
- [杜教筛] 51nod1238. 最小公倍数之和 V3
- 平均
- 51Nod_1419最小公倍数挑战
- 51Nod--1012最小公倍数
- 51nod 最大公约数 & 最小公倍数
- 【51nod1363】最小公倍数之和
- [51nod1238]最小公倍数之和
- 51nod_1012 最小公倍数LCM
- 51Nod1012 最小公倍数LCM
- 51nod1222 最小公倍数计数
- TCP/IP
- mysql事务隔离级别 脏读,不可重复读,幻象读
- jquery异步机制源码分析
- 1013. Image Segmentation (35)解题报告
- block块中引用成员变量引起内存泄漏问题
- 【51Nod1227】平均最小公倍数-杜教筛
- Mac 安装docker
- docker安装ubuntu14.04 免登录dockerfile版
- redis基础入门-redis系列教程
- Python中的join()函数的用法
- 3个著名加密算法(MD5、RSA、DES)的解析
- anaconda3 安装python包
- 设计模式--缺省适配器模式
- 51nod 1279 扔盘子(单调栈)