在l到r的数字中,含有因数为i*k的个数为r/(i*k)-(l)/(i*k),方案数就为t^n种,但gcd=i*k,则选择相同的n个数和f[i*k](2<=j<=m)都是不行的要减去,所以从大到小枚举i,最后输出f[1]就行啦(如果l<=k<=r ),就要给f[1]++
#include<cstdio>
#include<cstring>
#define maxl 100010
#define mod 1000000007
long long n,k,l,r;
long long f[maxl];
long long quickpow(long long a,long long b)
{
long long ans=1,cnt=a;
while(b>0)
{
if(b%2)
ans=(ans*cnt)%mod;
cnt=(cnt*cnt)%mod;
b=b/2;
}
return ans;
}
void prework()
{
scanf("%d%d%d%d",&n,&k,&l,&r);
}
void mainwork()
{
long long a,b;
for(int i=(r-l+1);i>=1;i--)
{
a=r/(k*i);b=(l-1)/(k*i);
f[i]=quickpow((a-b),n);
f[i]=(f[i]-(a-b)+mod)%mod;
for(int j=2;j<=(r-l)/i;j++)
f[i]=(f[i]-f[i*j]+mod)%mod;
}
if(k>=l && k<=r)
f[1]++;
}
void print()
{
printf("%lld",f[1]);
}
int main()
{
prework();
mainwork();
print();
return 0;
}