列表

详情


NC214463. 关灯

描述

您手中有n盏灯,其中有k盏灯是亮的,您的目的是将所有灯都熄灭。

但是您只有一种操作方式:

等概率地选择一盏灯反转它的状态(如果原来是亮的,那它熄灭,如果原来是熄灭的,那它被点亮)这被视为一次操作。

请问达成目的的期望操作次数。

输入描述

两个正整数n,k表示所有灯的盏数和现在亮着的盏数,

答案可能很大(对1000000007取模)

输出描述

输出一个整数代表答案

示例1

输入:

3 1

输出:

7

示例2

输入:

3 2

输出:

9

示例3

输入:

4 4

输出:

333333357

说明:

分数形式是\frac{64}{3}

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 28ms, 内存消耗: 720K, 提交时间: 2022-04-07 21:23:28

#include <stack>
#include <queue>
#include <vector>
#include <cstdio>
#include <map>
#include <bitset>
#include <cstring>
#include <iostream>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define ull unsigned long long
int n,k,dp[100005];
const int mod=1e9+7;
int qkpow(int a,int b){
	int base=a,ans=1;
	while(b){
		if(b&1)ans=1ll*ans*base%mod;
		base=1ll*base*base%mod;
		b>>=1; 
	}
	return ans;
}
int main() {
	scanf("%d %d",&n,&k);
	dp[0]=0,dp[1]=qkpow(2,n)-1,dp[2]=1ll*(dp[1]-1)*n%mod*qkpow(n-1,mod-2)%mod;
	for(int i=2;i<k;i++){
		dp[i+1]=1ll*n*(dp[i]-(1ll*dp[i-1]*i%mod*qkpow(n,mod-2)%mod)-1)%mod*qkpow(n-i,mod-2)%mod;
	}
	printf("%d\n",(dp[k]+mod)%mod);
    return 0;
}
/*
dp[i]=k[i]dp[i+1]
dp[i]-dp[i-1]*(n-i+1)/n=dp[i+1]*(i+1)/n+1
dp[i]=k[i-1]dp[i](n-i+1)/n+dp[i+1]*(i+1)/n
*/

上一题