CQOI2015 选数
SOL:先都除K,然后我们考虑容斥,我们考虑f[i]为gcd是i的倍数的方案数,g[i]是正好是k的方案数,然后容斥。
从大到小做, g[i]=f[i]-simgma g[i*k] k>1
最后l==1时全选1未计入,+1就好了。
#include<bits/stdc++.h> #define LL long long #define mo 1000000007 using namespace std; inline LL qsm(LL x,LL y) { static LL anw; for (anw=1;y;y>>=1,x=x*x%mo) if (y&1) (anw*=x)%=mo; return anw; } int n,k,l,h,ll,rr,f[mo>>10],ans; int main () { scanf("%d%d%d%d",&n,&k,&l,&h); l=l/k+(l%k>0); h=h/k; for (int i=1;i<=h-l;i++) { ll=l,rr=h; ll=ll/i+(ll%i>0); rr/=i; if (ll>rr)continue; f[i]=(qsm(rr-ll+1,n)-(rr-ll+1)+mo)%mo; } for (int i=h-l;i;i--) for (int j=2*i;j<=h-l;j+=i) f[i]=(f[i]-f[j]+mo)%mo; ans=(f[1]+(l==1))%mo; printf("%d\n",ans); }