[北理工乐学] NH-5 Probability

北理工乐学 NH-5 Probability

题目描述

在斗角场在你偷偷下了注,赌赢了,获得了一个小游戏资格,能免费送棒棒糖!

活动规则:在一个长度为 N N N的数列的 N N N个位置随机填入一个 ∈ [ 1 , M A X ] \in [1,MAX] [1,MAX]的数,一个免费获得的棒棒糖数记为 ∑ i = 1 N − 1 [ gcd ⁡ ( a i , a i + 1 ) = a i ] \sum_{i=1}^{N - 1}[\gcd(a_i,a_{i+1})=a_i] i=1N1[gcd(ai,ai+1)=ai] [ gcd ⁡ ( a i , a i + 1 ) = a i ] [\gcd(a_i,a_{i+1})=a_i] [gcd(ai,ai+1)=ai]表示如果 a i a_i ai, a i + 1 a_{i+1} ai+1的最大公因数等于 a i a_i ai,则 [ gcd ⁡ ( a i , a i + 1 ) = a i ] = 1 [\gcd(a_i,a_{i+1})=a_i]=1 [gcd(ai,ai+1)=ai]=1,否则 [ gcd ⁡ ( a i , a i + 1 ) = a i ] = 0 [\gcd(a_i,a_{i+1})=a_i]=0 [gcd(ai,ai+1)=ai]=0。富有的你不在意你能得到几个棒棒糖,而是想计算一下你随机填数后得到免费棒棒糖的期望数量。由于你很讨厌小数,你打算将答案对 1 0 9 + 7 10^9+7 109+7取模。期望和取模的概念详见样例解释。

数据范围

1 ≤ T ≤ 6 , 1 ≤ N ≤ 1 0 12 , 1 ≤ M A X ≤ 1 0 12 1\leq T\leq 6,1\leq N\leq 10^{12},1\leq MAX\leq 10^{12} 1T61N10121MAX1012,已知 M A X MAX MAX不是P的倍数, ( P = 1 0 9 + 7 ) (P=10^9+7) (P=109+7)

题目大意

随机化一个长度为 N N N 各个值在 [ 1 , M A X ] [1,MAX] [1,MAX]的序列,求 ∑ i = 1 N − 1 [ gcd ⁡ ( a i , a i + 1 ) = a i ] \sum_{i=1}^{N-1} [\gcd(a_i, a_{i+1}) = a_i] i=1N1[gcd(ai,ai+1)=ai] 的期望。

分析

显然可以得到最终的答案为
∑ s e q ∑ i = 1 N − 1 [ gcd ⁡ ( a i , a i + 1 ) = a i ] M A X N \frac{\sum_{seq} \sum_{i=1}^{N-1}[\gcd(a_i, a_{i+1}) = a_i]}{{MAX}^N} MAXNseqi=1N1[gcd(ai,ai+1)=ai]

分母可以利用快速幂求出逆元,所以我们的重点就变到了如何计算分子。

显然我们不可能枚举所有的序列以计算式子,所以我们考虑计算每个 a i a_i ai 的贡献。

对于一个给定的 a i a_i ai,注意到要算它的贡献则必须把 a i + 1 a_{i+1} ai+1 也确定下来,而整个序列其他位置可任意取值,所以一个给定的 a i a_i ai 的贡献为 M A X N − 2 ∑ a i + 1 = 1 M A X [ gcd ⁡ ( a i , a i + 1 ) = a i ] MAX^{N-2} \sum_{a_{i+1}=1}^{MAX}[\gcd(a_i,a_{i+1})=a_i] MAXN2ai+1=1MAX[gcd(ai,ai+1)=ai]。而所有的 a i a_i ai 均等价,所以分子就可化为:

( N − 1 ) ⋅ M A X N − 2 ⋅ ∑ a i = 1 M A X ∑ k = 1 M A X [ gcd ⁡ ( a i , k ) = a i ] (N-1)\cdot MAX^{N-2} \cdot \sum_{a_i=1}^{MAX}\sum_{k=1}^{MAX} [\gcd(a_i, k) = a_i] (N1)MAXN2ai=1MAXk=1MAX[gcd(ai,k)=ai]

接下来计算 ∑ k = 1 M A X [ gcd ⁡ ( a i , k ) = a i ] \sum_{k=1}^{MAX}[\gcd(a_i, k)=a_i] k=1MAX[gcd(ai,k)=ai]

这个式子的实际意义就是计算 a i a_i ai [ 1 , M A X ] [1,MAX] [1,MAX] 上的倍数个数,显然可知这个数是 ⌊ M A X a i ⌋ \lfloor \frac{MAX}{a_i} \rfloor aiMAX,所以我们就仅需计算 ∑ a i = 1 M A X ⌊ M A X a i ⌋ \sum_{a_i = 1}^{MAX} \lfloor \frac{MAX}{a_i} \rfloor ai=1MAXaiMAX

但注意到 M A X MAX MAX 值极大,我们无法直接计算这个和式,这里我选了一个比较取巧的方法(听大佬讲的)(不知道数论分块能不能做这道题,如有记得评论区评论一下)。

考虑计算 ∑ i = 1 ⌊ M A X ⌋ ⌊ M A X i ⌋ \sum_{i=1}^{{\lfloor \sqrt{MAX} \rfloor}} \lfloor \frac{MAX}{i} \rfloor i=1MAX iMAX,注意到这个是可以直接计算的,不妨认为答案即为 2 ∑ i = 1 ⌊ M A X ⌋ ⌊ M A X i ⌋ 2\sum_{i=1}^{\lfloor \sqrt{MAX} \rfloor} \lfloor \frac{MAX}{i} \rfloor 2i=1MAX iMAX,因为在枚举因数的时候我们仅需考虑 [ 1 , ⌊ M A X ⌋ ] [1,{\lfloor \sqrt{MAX} \rfloor}] [1,MAX ] 的部分,另外一部分可简单地通过除法来取得。

但直接计算会发现答案远远超出正确值,这也意味着我们必须找出重复值。

注意到对于 i i i ⌊ M A X i ⌋ \lfloor \frac{MAX}{i} \rfloor iMAX ⌊ i M A X i ⌋ \lfloor \frac{i\sqrt{MAX}}{i} \rfloor iiMAX 实际上是有重复的,这是必须扣除的。简单计算得到重复的数目为 ( ⌊ M A X ⌋ ) 2 (\lfloor \sqrt{MAX} \rfloor)^2 (⌊MAX )2

所以,本题答案为

( N − 1 ) ⋅ M A X N − 2 ⋅ ( 2 × ∑ i = 1 ⌊ M A X ⌋ − ( ⌊ M A X ⌋ ) 2 ) M A X N \frac{(N-1) \cdot MAX^{N-2} \cdot (2\times \sum_{i=1}^{\lfloor \sqrt{MAX} \rfloor} - (\lfloor \sqrt{MAX} \rfloor)^2)}{MAX^N} MAXN(N1)MAXN2(2×i=1MAX (⌊MAX )2)

注意到本题数据极大,进行快速幂前应先对底数取模以保证数据不会炸 long long(我因为这个问题调了好久)。

参考代码

#include <stdio.h>
#include <math.h>

const long long Mod = (long long)1E9 + 7;

long long quickpow(long long a, long long n) {
    a %= Mod;
	long long ret = 1;
	while(n) {
		if(n & 1) ret = (ret * a) % Mod;
		a = (a * a) % Mod, n >>= 1;
	}
	return ret;
}

int main() {
	int T;
	scanf("%d", &T);
	while(T--) {
		long long N, M;
		scanf("%lld %lld", &N, &M);
		if(N == 1) {puts("0"); continue;}
		long long sum = 0;
		for(long long i = 1; i * i <= M; i++)
			sum = (sum + (M / i)) % Mod;
		sum = (sum * 2 % Mod - ((long long)(sqrt(M)) * (long long)(sqrt(M)) % Mod) + Mod) % Mod;
		sum = ((sum * ((N - 1) % Mod)) % Mod) * quickpow(M, N - 2) % Mod;
		printf("%lld\n", sum * quickpow(quickpow(M, N), Mod - 2) % Mod);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值