[CQOI2015]选数

题面

∑ 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] LHLH...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=1H(drdl)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;这个特判

总之这题也比较细节

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值