[CF1523E]Crypto Lights

2024-03-16 22:58
文章标签 crypto lights cf1523e

本文主要是介绍[CF1523E]Crypto Lights,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Crypto Lights

题目大意

给你一个长度为 n n n 0 / 1 0/1 0/1序列,最开始全都为 0 0 0。你将一直执行下列操作:

  • 从为 0 0 0的点中等概率选择一个点,将其变为 1 1 1
  • 如果有两个为 1 1 1的点之间距离小于 k k k,则停止操作,否则继续执行上面的操作。

请问你执行停止后序列中 1 1 1的期望个数。 ( 2 ⩽ k ⩽ n ⩽ 1 0 5 ) (2\leqslant k\leqslant n\leqslant 10^5) (2kn105)

题解

先吐槽一下这题意真的很难懂,我读错了 3 3 3次。

image-20210531210709569

法一

我们可以发现 E ( N u m b e r o f 1 ′ s o c c u r r e n c e s ) = E ( t i m e s w h i l e s t o p ) = E ( t i m e s b e f o r e s t o p ) + 1 E(Number\,of\,1's\,occurrences)=E(times\,while\,stop)=E(times\, before\,stop)+1 E(Numberof1soccurrences)=E(timeswhilestop)=E(timesbeforestop)+1
我们可以去寻找在停止之前操作了多少次。

假设我们已经操作了 p p p次,那么我们现在有 p p p 1 1 1,而每两个 1 1 1之间至少有 k − 1 k-1 k1 0 0 0,总共有 ( p − 1 ) ( k − 1 ) (p-1)(k-1) (p1)(k1) 0 0 0
我们将这 ( p − 1 ) ( k − 1 ) (p-1)(k-1) (p1)(k1) 0 0 0去掉,我们之后相当于从剩 n − ( p − 1 ) ( k − 1 ) n-(p-1)(k-1) n(p1)(k1)个位置中选择 k k k个为 1 1 1,再将那 ( p − 1 ) ( k − 1 ) (p-1)(k-1) (p1)(k1) 0 0 0插入两个不同位置的 1 1 1中间的空隙中。可以发现,这样与合法的方案是一一对应的。
于是,我们选择 p p p个数时未停止的方案数为 ( n − ( p − 1 ) ( k − 1 ) p ) p ! \binom{n-(p-1)(k-1)}{p}p! (pn(p1)(k1))p!,而每种方案的概率为 ( n − i ) ! n ! \frac{(n-i)!}{n!} n!(ni)!

所以我们的期望的操作次数为 ∑ i = 1 n ( n − ( i − 1 ) ( k − 1 ) i ) i ! ( n − i ) ! n ! \sum_{i=1}^{n}\frac{\binom{n-(i-1)(k-1)}{i}i!(n-i)!}{n!} i=1nn!(in(i1)(k1))i!(ni)!
加上 1 1 1就是最后的答案。

法二

或者我们可以直接考虑在什么时候停止,还是可以用上面的方法退出选择 i i i个数时未停止的方案数为 ( n − ( i − 1 ) ( k − 1 ) i ) i ! \binom{n-(i-1)(k-1)}{i}i! (in(i1)(k1))i!,记作 g i g_{i} gi
那么选择 i i i个时已停止的方案数为 ( n − i + 1 ) d p i − 1 − d p i (n-i+1)dp_{i-1}-dp_{i} (ni+1)dpi1dpi
答案为 ∑ i = 1 n ( ( n − i + 1 ) d p i − 1 − d p i ) ( n − i ) ! n ! \sum_{i=1}^{n}((n-i+1)dp_{i-1}-dp_{i})\frac{(n-i)!}{n!} i=1n((ni+1)dpi1dpi)n!(ni)!

其实两种做法本质上是一样的。

时间复杂度都是 O ( n ) O\left(n\right) O(n)

源码

法一

#include<bits/stdc++.h>
using namespace std;
#define MAXN 200005
#define lowbit(x) (x&-x)
#define reg register
#define mkpr make_pair
#define fir first
#define sec second
typedef long long LL;
typedef unsigned long long uLL;
const LL INF=0x3f3f3f3f3f3f3f3f;
const int mo=1e9+7;
const int zero=500;
const LL jzm=2333;
const int orG=3,invG=332748118;
const double Pi=acos(-1.0);
typedef pair<int,int> pii;
const double PI=acos(-1.0);
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
}
template<typename _T>
void print(_T x){if(x<0){x=(~x)+1;putchar('-');}if(x>9)print(x/10);putchar(x%10+'0');}
int add(int x,int y){return x+y<mo?x+y:x+y-mo;}
int t,n,k,pow2[MAXN],fac[MAXN],f[MAXN],inv[MAXN],ans;
int qkpow(int a,int s){int t=1;while(s){if(s&1)t=1ll*a*t%mo;a=1ll*a*a%mo;s>>=1;}return t;}
void init(){pow2[0]=1;for(int i=1;i<=1e5;i++)pow2[i]=2ll*pow2[i-1]%mo;fac[0]=fac[1]=f[1]=inv[0]=inv[1]=1;for(int i=2;i<=1e5;i++)fac[i]=1ll*i*fac[i-1]%mo,f[i]=1ll*(mo-mo/i)*f[mo%i]%mo,inv[i]=1ll*inv[i-1]*f[i]%mo;
}
int C(int x,int y){if(x<y||x<0||y<0)return 0;return 1ll*fac[x]*inv[y]%mo*inv[x-y]%mo;
}
signed main(){read(t);init();while(t--){read(n);read(k);ans=0;for(int i=1;i<=n&&(i-1)*(k-1)<=n;i++)ans=add(ans,1ll*C(n-(i-1)*(k-1),i)*fac[i]%mo*inv[n]%mo*fac[n-i]%mo);printf("%d\n",add(ans,1));}return 0;
}

法二

#include<bits/stdc++.h>
using namespace std;
#define MAXN 200005
#define lowbit(x) (x&-x)
#define reg register
#define mkpr make_pair
#define fir first
#define sec second
typedef long long LL;
typedef unsigned long long uLL;
const LL INF=0x3f3f3f3f3f3f3f3f;
const int mo=1e9+7;
const int zero=500;
const LL jzm=2333;
const int orG=3,invG=332748118;
const double Pi=acos(-1.0);
typedef pair<int,int> pii;
const double PI=acos(-1.0);
template<typename _T>
_T Fabs(_T x){return x<0?-x:x;}
template<typename _T>
void read(_T &x){_T f=1;x=0;char s=getchar();while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}while('0'<=s&&s<='9'){x=(x<<3)+(x<<1)+(s^48);s=getchar();}x*=f;
}
template<typename _T>
void print(_T x){if(x<0){x=(~x)+1;putchar('-');}if(x>9)print(x/10);putchar(x%10+'0');}
int add(int x,int y){return x+y<mo?x+y:x+y-mo;}
int t,n,k,pow2[MAXN],fac[MAXN],f[MAXN],inv[MAXN],ans,dp[MAXN],sum;
int qkpow(int a,int s){int t=1;while(s){if(s&1)t=1ll*a*t%mo;a=1ll*a*a%mo;s>>=1;}return t;}
void init(){pow2[0]=1;for(int i=1;i<=1e5;i++)pow2[i]=2ll*pow2[i-1]%mo;fac[0]=fac[1]=f[1]=inv[0]=inv[1]=1;for(int i=2;i<=1e5;i++)fac[i]=1ll*i*fac[i-1]%mo,f[i]=1ll*(mo-mo/i)*f[mo%i]%mo,inv[i]=1ll*inv[i-1]*f[i]%mo;
}
int C(LL x,int y){if(x<y||x<0||y<0)return 0;return 1ll*fac[x]*inv[y]%mo*inv[x-y]%mo;
}
signed main(){read(t);init();while(t--){read(n);read(k);ans=sum=0;dp[0]=1;for(int i=1;i<=n;i++){dp[i]=1ll*C(1ll*n-1ll*(i-1)*(k-1),i)*fac[i]%mo;int tmp=add(mo-dp[i],1ll*(n-i+1)*dp[i-1]%mo);ans=add(ans,1ll*i*tmp%mo*fac[n-i]%mo*inv[n]%mo);}printf("%d\n",ans);}return 0;
}

谢谢!!!

这篇关于[CF1523E]Crypto Lights的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/817004

相关文章

[羊城杯 2024] Crypto

文章目录 TH_Curvebaby_CurveRSA_lossTheoremPlus TH_Curve 题目描述: from Crypto.Util.number import *from secret import flagdef add_THcurve(P, Q):if P == (0, 0):return Qif Q == (0, 0):return Px1, y1

[DASCTF2024八月开学季!] Crypto

文章目录 EZsquaresEZmatrixEZsignin EZsquares 题目描述: from Crypto.Util.number import *from gmpy2 import *from secret import flagp=getPrime(512)q=getPrime(512)n0=p**2+q**2print('n0 =',n0)e=655

golang RSA 解密前端jsencrypt发送的数据时异常 crypto/rsa: decryption error 解决方法

golang中 RSA解密前端(jsencrypt)发来的密文后出现  "crypto/rsa: decryption error"  , 这个问题首先需要确认你的私匙和公匙是否匹配, 如果匹配 那检查入参数据类型, 前端发送来的rsa加密后的数据一般都是经过base64编码后的, 在后端进行RSA解码时需要对前端发送的数据进行base64解码! crypto/rsa: decryption

NSSCTF练习记录:[鹤城杯 2021]A_CRYPTO

题目: 4O595954494Q32515046324757595N534R52415653334357474R4N575955544R4O5N4Q46434S4O59474253464Q5N444R4Q51334557524O5N4S424944473542554O595N44534O324R49565746515532464O49345649564O464R4R494543504N35

polarctf靶场[CRYPTO]显而易见的密码、[CRYPTO]夏多的梦、[CRYPTO]再这么说话我揍你了、[CRYPTO]神秘组织M

[CRYPTO]显而易见的密码 考点:ntlm编码 打开文件,显示内容就是ntlm格式 ntlm解密 在线网站: https://www.cmd5.com/便可得到flag [CRYPTO]夏多的梦 根据题目提示可以猜测为夏多密码 考点:夏多密码 在线加密原理网站: 加密解密原理:https://blog.csdn.net/destiny1507/article

polarctf靶场【四方密码题】【CRYPTO】不一样的四四方方、四个正方形

[CRYPTO]不一样的四四方方 考点:四方密码 在线网站: https://www.metools.info/code/four-square244.html 或者https://wtool.com.cn/four.html 请开始你的表演(密文):jilinjingcha注意:正确的密钥后面最后一个字母不要!!!key1:informationkey2:engineering

poj 1222 EXTENDED LIGHTS OUT (高斯消元解异或方程组 开关问题)

近距离观摩今天北京站的比赛,向志愿者学姐要了一份题目,看了看H题; 因为数据被弱化,瞬间就想到了背包; 就先研究下标准解法——异或方程组; 下面为转载文: 题意:有一个5*6的矩阵,每个位置都表示按钮和灯,1表示亮,0表示灭。每当按下一个位置的按钮,它和它周围灯的状态全部翻转,问在这样的一个方阵中按下哪些按钮可以把整个方阵都变成灭的,这时1表示按了,0表示没按。 以下

Crypto++:私钥和公钥保存到文件

在Crypto++库中,生成的RSA私钥和公钥可以通过将它们序列化到文件来保存。这通常涉及到使用FileSink来将密钥的数据写入到文件中。以下是一个示例函数,展示了如何将RSA私钥和公钥保存到文件中: #include <cryptopp/rsa.h>#include <cryptopp/osrng.h>#include <cryptopp/files.h>#include <fstre

Repair LED lights

Repair LED lights  修理LED灯,现在基本用灯带,就是小型LED灯串联一起的 1)拆旧灯条,这个旧的是用螺丝拧的产品 电闸关掉。 2)五金店买一个,这种是磁铁吸附的产品 现在好多都是铝线啊。。。 小部件,我没用上

SGU 103. Traffic Lights 带限制最短路

每个点有2中颜色 只有一条路上的两个点颜色一样才能通过这条路 最短路加上等待的时间处理 处理的是参考别人的 唉还是太弱了 #include <cstdio>#include <cstring>#include <vector>#include <queue>#include <algorithm>using namespace std;int s, e;int n, m;in