bzoj3930 [CQOI2015]选数
2017-06-12 21:45
323 查看
Description
我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案。小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一步研究。然而他很快发现工作量太大了,于是向你寻求帮助。你的任务很简单,小z会告诉你一个整数K,你需要回答他最大公约数刚好为K的选取方案有多少个。由于方案数较大,你只需要输出其除以1000000007的余数即可。Input
输入一行,包含4个空格分开的正整数,依次为N,K,L和H。Output
输出一个整数,为所求方案数。Sample Input
2 2 2 4Sample Output
3HINT
样例解释所有可能的选择方案:(2, 2), (2, 3), (2, 4), (3, 2), (3, 3), (3, 4), (4, 2), (4, 3), (4, 4)
其中最大公约数等于2的只有3组:(2, 2), (2, 4), (4, 2)
对于100%的数据,1≤N,K≤10^9,1≤L≤H≤10^9,H-L≤10^5
正解:莫比乌斯反演+杜教筛。
看到$PoPoQQQ$设了两个函数,于是照着模仿,自己推了一下。。
设$f(k)$表示$[l,r]$中选数,$gcd=d$的方案数。
设$g(k)$表示$[l,r]$中选数,$d|gcd$的方案数,易知$g(k)=(\left \lfloor \frac{r}{k} \right \rfloor-\left \lfloor \frac{l-1}{k} \right \rfloor)^{n}$。
因为$g(k)=\sum_{k|d}f(d)$,由莫比乌斯反演,$f(k)=\sum_{k|d} \mu(\frac{d}{k})g(i)$。
令$d=kQ$,$f(k)=\sum_{Q=1}^{\left \lfloor \frac{r}{k} \right \rfloor}\mu(Q)(\left \lfloor \frac{r}{kQ} \right \rfloor-\left \lfloor \frac{l-1}{kQ} \right \rfloor)^{n}$。
此时我们可以把$l-1,r$同除以$k$,用杜教筛求出莫比乌斯函数的前缀和,然后数论分块就能计算出答案了。
//It is made by wfj_2048~ #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <vector> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #define rhl (1000000007) #define N (3000010) #define inf (1<<30) #define il inline #define RG register #define ll long long #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std; int mu ,vis ,prime ,n,k,l,r,cnt,maxn; ll ans; map <int,int> f,vi; il int gi(){ RG int x=0,q=1; RG char ch=getchar(); while ((ch<'0' || ch>'9') && ch!='-') ch=getchar(); if (ch=='-') q=-1,ch=getchar(); while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x; } il ll qpow(RG ll a,RG ll b){ RG ll ans=1; while (b){ if (b&1) ans=ans*a%rhl; a=a*a%rhl,b>>=1; } return ans; } il void sieve(){ mu[1]=1; for (RG int i=2;i<=maxn;++i){ if (!vis[i]) prime[++cnt]=i,mu[i]=rhl-1; for (RG int j=1,k;j<=cnt;++j){ k=i*prime[j]; if (k>maxn) break; vis[k]=1; if (i%prime[j]) mu[k]=rhl-mu[i]; else break; } } for (RG int i=2;i<=maxn;++i){ mu[i]+=mu[i-1]; if (mu[i]>=rhl) mu[i]-=rhl; } return; } il ll du(RG int n){ if (n<=maxn) return mu ; if (vi ) return f ; RG ll ans=1; RG int pos; vi =1; for (RG int i=2;i<=n;i=pos+1){ pos=n/(n/i),ans-=(ll)(pos-i+1)*du(n/i)%rhl; if (ans<0) ans+=rhl; } return f =ans; } il void work(){ n=gi(),k=gi(),l=(gi()-1)/k,r=gi()/k,maxn=min(3000000,r),sieve(); for (RG int q=1,p,pos;q<=r;q=pos+1){ p=l/q; if (!p) pos=r/(r/q); else pos=min(l/(l/q),r/(r/q)); (ans+=(du(pos)-du(q-1)+rhl)*qpow(r/q-l/q,n))%=rhl; } printf("%lld\n",ans); return; } int main(){ File("number"); work(); return 0; }
相关文章推荐
- bzoj3930【CQOI2015】选数
- BZOJ 3930: [CQOI2015]选数
- 【BZOJ3930】【CQOI2015】选数(递推 & 莫比乌斯反演)
- [BZOJ3930][CQOI2015]选数(莫比乌斯反演+杜教筛)
- [BZOJ3930][CQOI2015]选数(莫比乌斯反演+杜教筛)
- 【反演复习计划】【COGS2433】&&【bzoj3930,CQOI2015选数】爱蜜莉雅的冰魔法
- BZOJ3930 [CQOI2015]选数
- BZOJ 3930: [CQOI2015]选数 递推
- bzoj 3930: [CQOI2015]选数【递推】
- BZOJ3930 【CQOI2015】选数
- bzoj3930 [CQOI2015]选数
- [BZOJ3930][CQOI2015]选数
- 【bzoj3930】[CQOI2015]选数 莫比乌斯反演
- 【BZOJ 3930】【CQOI 2015】选数
- [CQOI2015][bzoj3930] 选数 [杜教筛+莫比乌斯反演]
- bzoj3930 [CQOI2015]选数
- 【BZOJ3930】[CQOI2015]选数 莫比乌斯反演
- bzoj 3930: [CQOI2015]选数 (杜教筛+反演)
- Bzoj3930: [CQOI 2015] 选数 & COGS2699: [CQOI 2015] 选数加强版
- luogu3172 && bzoj3930 [CQOI2015]选数