题面
∑ L H ∑ L H . . . ∑ L H [ g c d ( a 1 , a 2 , . . . , a n ) = k ] \sum_{L}^{H}\sum_{L}^{H}...\sum_{L}^{H}[gcd(a_1,a_2,...,a_n)=k] ∑LH∑LH...∑LH[gcd(a1,a2,...,an)=k](n个sigma)
题解
这题比较创新的地方是选出n个数,但是由于之前做过选4个数的题,看到这道就直接秒了。
最后的式子是这个:
∑
d
=
1
H
(
⌊
r
d
⌋
−
⌊
l
d
⌋
)
n
μ
(
d
)
\sum_{d=1}^{H}(\lfloor\frac{r}{d}\rfloor-\lfloor\frac{l}{d}\rfloor)^n\mu(d)
d=1∑H(⌊dr⌋−⌊dl⌋)nμ(d)
看到这题的数据范围发现需要杜教筛,于是再套一个杜教筛。
放代码:
using namespace std;
namespace fastio{
template<typename tn> void read(tn &a){
tn x=0,f=1;char c=' ';
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(; isdigit(c);c=getchar() ) x=x*10+c-'0';
a=x*f;
}
template<typename tn> void print(tn a){
if(a<0) putchar('-'),a=-a;
if(a>9) print(a/10);
putchar(a%10+'0');
}
};
using namespace fastio;
const int N=1e7+5;
const int mod=1e9+7;
const int inf=2e9;
int poww(int a,int b){
int ans=1;
while(b){
if(b&1) ans=1ll*ans*a%mod;
b>>=1;
a=1ll*a*a%mod;
}
return ans;
}
int n,k,x,y;
int mu[N],prime[N>>2],cnt;
bool is_prime[N];
map<int,int> ansmu;
int Sum(int n){
if(n<N) return mu[n];
if(ansmu[n]) return ansmu[n];
int ans=0;
for(int l=2,r;l<=n;l=r+1){
r=n/(n/l);
ans=1ll*(ans+1ll*Sum(n/l)*(r-l+1)%mod)%mod;
}
return ansmu[n]=1ll-ans;
}
int ans;
int main(){
read(n);
read(k);
read(x);
read(y);
--x/=k;
y/=k;
mu[1]=1;
for(int i=2;i<N;i++){
if(!is_prime[i]) prime[++cnt]=i,mu[i]=-1;
for(int j=1;j<=cnt&&prime[j]*i<N;j++){
is_prime[prime[j]*i]=1;
if(i%prime[j]==0){
mu[i*prime[j]]=0;
break;
}
mu[i*prime[j]]=-mu[i];
}
mu[i]=(mu[i-1]+mu[i])%mod;
}
for(int l=1,r;l<=y;l=r+1){
r=min(x/l?x/(x/l):inf,y/(y/l));
int a=x/l;
int b=y/l;
ans=1ll*(ans+1ll*poww(b-a,n)*(Sum(r)-Sum(l-1))%mod)%mod;
}
printf("%d\n",ans);
return 0;
}
de出来的bug:
x/l?x/(x/l):inf
这个特判--x/=k;
这个特判
总之这题也比较细节