[CF992C Nastya and a Wardrobe] 题解

[CF992C Nastya and a Wardrobe] 题解

一看就是数(猜)学(的)题

推公式!!!

对于第一个月来说,裙子的数量取值为 [ x × 2 − 1 , x × 2 ] ∩ Z [x\times2-1,x\times2]\cap \mathbb Z [x×21,x×2]Z ,而每种取值的概率都是 50 % 50\% 50%

对于第二个月来说,裙子的数量取值范围是 [ ( x × 2 − 1 ) × 2 − 1 , x × 2 × 2 ] ∩ Z ≡ [ x × 2 2 − 2 2 + 1 , x × 2 2 ] ∩ Z [(x\times2-1)\times2-1,x\times2\times2]\cap \mathbb Z\equiv [x\times2^2-2^2+1,x\times2^2]\cap \mathbb Z [(x×21)×21,x×2×2]Z[x×2222+1,x×22]Z ,而每种取值的概率都是 25 % 25 \% 25%

对于第三个月来说,裙子的数量取值范围是 [ ( ( x × 2 − 1 ) × 2 − 1 ) × 2 − 1 , x × 2 × 2 × 2 ] ∩ Z ≡ [ x × 2 3 − 2 3 + 1 , x × 2 3 ] ∩ Z [((x\times2-1)\times2-1)\times2-1,x\times2\times2\times2]\cap \mathbb Z\equiv [x\times2^3-2^3+1,x\times2^3]\cap \mathbb Z [((x×21)×21)×21,x×2×2×2]Z[x×2323+1,x×23]Z ,而每种取值的概率都是 12.5 % 12.5\% 12.5%

更一般的对于前 k k k 个月中某月 n n n ,我们可以发现它裙子数量可以达到的值是 [ x × 2 k − 2 k + 1 , x × 2 k ] ∩ Z [x\times 2 ^k -2^k+1,x\times 2^k]\cap \mathbb Z [x×2k2k+1,x×2k]Z

而对于每种情况,其概率都为 100 % 2 k \frac{100\%}{2^k} 2k100% ,所以在前 k k k 个月,数量的期望是 x × 2 k + 1 − 2 k + 1 2 \frac{x\times 2^{k+1}-2^k+1}{2} 2x×2k+12k+1 ,由于最后一个月数量乘二,所以最终结果为 x × 2 k + 1 − 2 k + 1 x\times2^{k+1}-2^k+1 x×2k+12k+1

所以快速幂一下就行了。

ps:不开 long long 见祖宗,还需判断一下当 x = 0 x=0 x=0 的情况。

#include 
#define int long long
using namespace std;
#define max(x, y) (x > y ? x : y)
#define min(x, y) (x < y ? x : y)
const int mod = 1e9 + 7;
int fpow(int x, int p) {
	if (p == 0)
		return 1;
	if (p == 1)
		return x;
	int t = fpow(x, p / 2);
	if (p & 1)
		return (t * t % mod) * x % mod;
	return (t * t) % mod;
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int x, k;
	cin >> x >> k;
	if (x == 0) {
		cout << "0" << endl;
		return 0;
	}
	cout <<  ((((2 * x - 1 + mod) % mod) * fpow(2, k) + mod) % mod + 1) % mod << endl;
}

你可能感兴趣的:(题解,算法)