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
",ans);
}
原文地址:https://www.cnblogs.com/rrsb/p/8485368.html