4.数学

数学1(容斥、组合数学、期望)

开题顺序: \(HJFE\)

\(A\) luogu P3349 [ZJOI2016] 小星星

\(B\) CF1466H Finding satisfactory solutions

\(C\) Gym103415K Magus Night

\(D\) luogu P8292 [省选联考 2022] 卡牌

\(E\) CF1139D Steps to One

  • csp-s模拟11 T5 T2198. 传统题 ,设 \(len\) 表示序列长度,考虑统计 \(\begin{aligned}E(x) &=\sum\limits_{i=1}^{\infty}P(len=i) \times i \\ &=\sum\limits_{i=1}^{\infty}P(len \ge i) \\ &=1+\sum\limits_{i=1}^{\infty}P(len>i) \end{aligned}\)
  • 再拆一下式子,有 \(\begin{aligned} &\sum\limits_{i=1}^{\infty}P(len>i) \\ &=\sum\limits_{i=1}^{\infty}P(\gcd\limits_{j=1}^{i} \{ a_{j} \}>1) \\ &=\sum\limits_{i=1}^{\infty}1-P(\gcd\limits_{j=1}^{i} \{ a_{j} \}=1) \\ &=\sum\limits_{i=1}^{\infty}1-\frac{\sum\limits_{a_{1}=1}^{m}\sum\limits_{a_{2}=1}^{m} \dots \sum\limits_{a_{i}=1}^{m}[\gcd\limits_{j=1}^{i} \{ a_{j} \}=1]}{m^{i}} \\ &=\sum\limits_{i=1}^{\infty}1-\frac{\sum\limits_{d=1}^{m}\mu(d)\sum\limits_{a_{1}=1}^{m}[d|a_{1}]\sum\limits_{a_{2}=1}^{m}[d|a_{2}] \dots \sum\limits_{a_{i}=1}^{m}[d|a_{i}]}{m^{i}} \\ &=\sum\limits_{i=1}^{\infty}1-\frac{\sum\limits_{d=1}^{m}\mu(d)\left\lfloor \frac{m}{d} \right\rfloor^{i} }{m^{i}} \\ &=-\sum\limits_{i=1}^{\infty}\frac{\sum\limits_{d=2}^{m}\mu(d)\left\lfloor \frac{m}{d} \right\rfloor^{i} }{m^{i}} \end{aligned}\)
  • 加上前面的 \(1\) ,并交换枚举顺序,得到 \(\begin{aligned} 1-\sum\limits_{d=2}^{m}\mu(d)\sum\limits_{i=1}^{\infty}(\frac{\left\lfloor \frac{m}{d} \right\rfloor }{m})^{i} \end{aligned}\)

\(F\) CF908D New Year and Arbitrary Arrangement

  • 以下所写 \(pa,pb\) 分别指原题的 \(\frac{pa}{pa+pb},\frac{pb}{pa+pb}\)

  • 停止加入当且仅当 ab 子序列个数 \(\ge k\) 。而一次加入对 ab 子序列个数的贡献不一定为 \(1\)\(0\) ,例如 aaaaa....a 后面加入一个 b

  • 因开头的 b 对答案是没有影响的,不妨钦定第一个放的是 a

  • 具体地,设 \(f_{i,j}\) 表示放了 \(i\)a ,形成了 \(j\)ab 子序列时的概率,状态转移方程为 \(\begin{cases} f_{i+1,j}+=f_{i,j} \times pa \\ f_{i,i+j}+=f_{i,j} \times pb \end{cases}\) ,边界为 \(f_{1,0}=1\)

  • \(i+j \ge k\) 时,可以直接统计期望累加在答案上。

  • 难点还是上述例子中的无限放 a 的可能,即难以处理 \(f_{k,j}(j \in [0,k-1])\) 的贡献。

  • 考虑枚举多余 a 的数量,有 \(\begin{aligned} E(x) &=f_{k,j}(j+\sum\limits_{i=0}^{\infty}pa^{i}pb(k+i)) \\ &=f_{k,j}(j+k+pb\sum\limits_{i=0}^{\infty}pa^{i}i) \end{aligned}\)

  • 把后面的 \(pb\sum\limits_{i=0}^{\infty}pa^{i}i=(1-pa)\sum\limits_{i=0}^{\infty}pa^{i}i\) 提出来单独考虑,有 \(\begin{aligned} &(1-pa)\sum\limits_{i=0}^{\infty}pa^{i}i \\ &=\sum\limits_{i=0}^{\infty}pa^{i}i-\sum\limits_{i=0}^{\infty}pa^{i+1}i \\ &=\sum\limits_{i=0}^{\infty}pa^{i}i-\sum\limits_{i=1}^{\infty}pa^{i}(i-1) \\ &=\sum\limits_{i=1}^{\infty}pa^{i} \end{aligned}\)

  • 发现这是个无限等比数列求和的形式,又因为 \(|pa|<1\) ,有 \(\sum\limits_{i=1}^{\infty}pa^{i}=\frac{pa}{1-pa}=\frac{pa}{pb}\)

    点击查看代码
    const ll p=1000000007;
    ll f[1010][1010];
    ll qpow(ll a,ll b,ll p)
    {
    	ll ans=1;
    	while(b)
    	{
    		if(b&1)
    		{
    			ans=ans*a%p;
    		}
    		b>>=1;
    		a=a*a%p;
    	}
    	return ans;
    }
    int main()
    {
    	ll k,pa,pb,sum,ans=0,i,j;
    	cin>>k>>pa>>pb;
    	sum=pa+pb;
    	pa=pa*qpow(sum,p-2,p)%p;
    	pb=pb*qpow(sum,p-2,p)%p;
    	f[1][0]=1;
    	for(i=1;i<=k-1;i++)
    	{
    		for(j=0;j<=k-1;j++)
    		{
    			f[i+1][j]=(f[i+1][j]+f[i][j]*pa%p)%p;
    			if(i+j>=k)
    			{
    				ans=(ans+(f[i][j]*pb%p)*(i+j)%p)%p;
    			}
    			else
    			{
    				f[i][i+j]=(f[i][i+j]+f[i][j]*pb%p)%p;
    			}
    		}
    	}
    	sum=pa*qpow(pb,p-2,p)%p;
    	for(j=0;j<=k-1;j++)
    	{
    		ans=(ans+(j+k+sum)%p*f[k][j]%p)%p;
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

\(G\) CF749E Inversions After Shuffle

\(H\) CF932E Team Work

  • 猜测 \(\sum\limits_{i=1}^{n}\dbinom{n}{i}i^{k}\)\(n,k\) 是可以递推的。

  • \(f_{n,k}=\sum\limits_{i=1}^{n}\dbinom{n}{i}i^{k}\) ,然后考虑把 \(\dbinom{n}{i}\) 拆成 \(\dbinom{n-1}{i}+\dbinom{n-1}{i-1}\)

  • 推式子,有 \(\begin{aligned} f_{n,k} &=\sum\limits_{i=1}^{n}\dbinom{n}{i}i^{k} \\ &=\sum\limits_{i=1}^{n}\dbinom{n-1}{i-1}i^{k}+\sum\limits_{i=1}^{n}\dbinom{n-1}{i}i^{k} \\ &=\sum\limits_{i=1}^{n}\frac{i}{n}\dbinom{n}{i}i^{k}+\sum\limits_{i=1}^{n-1}\dbinom{n-1}{i}i^{k} \\ &=\frac{1}{n}\sum\limits_{i=1}^{n}\dbinom{n}{i}i^{k+1}+f_{n-1,k} \\ &=\frac{1}{n}f_{n,k+1}+f_{n-1,k} \end{aligned}\)

  • 移项得到 \(f_{n,k+1}=n(f_{n,k}-f_{n-1,k})\) ,用 \(k\) 代替 \(k+1\) 得到 \(f_{n,k}=n(f_{n,k-1}-f_{n-1,k-1})\)

  • 因为 \(k \le 5000\) ,分讨 \(n,k\) 的大小关系后类似阶梯状向下更新即可。边界为 \(\begin{cases} f_{n',0}=\sum\limits_{i=1}^{n'}\dbinom{n'}{i}=2^{n'}-1 & n' \in [1,n] \\ f_{1,k'}=1 & k' \in [0,k] \end{cases}\)

    点击查看代码
    const ll p=1000000007;
    ll f[2][5010];
    ll qpow(ll a,ll b,ll p)
    {
    	ll ans=1;
    	while(b)
    	{
    		if(b&1)
    		{
    			ans=ans*a%p;
    		}
    		b>>=1;
    		a=a*a%p;
    	}
    	return ans;
    }
    int main()
    {
    	ll n,k,i,j;
    	cin>>n>>k;
    	if(n<k)
    	{
    		for(i=0;i<=k;i++)
    		{
    			f[1][i]=1;
    		}
    		for(i=2;i<=n;i++)
    		{
    			f[i&1][0]=(qpow(2,i,p)-1+p)%p;
    			for(j=1;j<=k;j++)
    			{
    				f[i&1][j]=(f[i&1][j-1]-f[(i-1)&1][j-1]+p)%p*i%p;
    			}
    		}
    	}
    	else
    	{
    		f[(n-k)&1][0]=(qpow(2,n-k,p)-1+p)%p;
    		for(i=n-k+1;i<=n;i++)
    		{
    			f[i&1][0]=(qpow(2,i,p)-1+p)%p;
    			for(j=1;j<=k;j++)
    			{
    				f[i&1][j]=(f[i&1][j-1]-f[(i-1)&1][j-1]+p)%p*i%p;
    			}
    		}
    	}
    	cout<<f[n&1][k]<<endl;
    	return 0;
    }
    

\(I\) CF578D LCS Again

\(J\) luogu P7914 [CSP-S 2021] 括号序列

  • 只设左右端点两维不太能进行转移,考虑增加一维。

  • \(f_{l,r,i}\) 表示使得 \([l,r]\) 的状态为 \(i\) 的超级括号序列方案数,其中 \(i=0/1/2/3/4\) 分别对应以下五种情况。

    • \(i=0\)\([l,r]\) 全部为 *
    • \(i=1\)\(l/r\) 分别为 ( / ),且 \([l+1,r-1]\) 是超级括号序列。
      • 左右直接被相互匹配的括号包裹,中间为超级括号序列。
    • \(i=2\)\(l/r\) 分别为 ( / *
      • 左边以括号序列开头,右边以 * 结尾,中间为超级括号序列。
    • \(i=3\)\(l/r\) 分别为 ( / )
      • 左边以括号序列开头,右边以括号序列结尾,中间为超级括号序列。
      • 包含了 \(i=1\) 的情况。
    • \(i=4\)\(l/r\) 分别为 * / )
      • 左边以 * 开头,右边以括号序列结尾,中间为超级括号序列。
  • 状态转移方程为 \(\begin{cases} f_{l,r,0}=f_{l,r-1,0} \times [r-l+1 \le k \land (s_{r}='?' \lor s_{r}='*')] \\ f_{l,r,1}=\sum\limits_{i \in \{ 0,2,3,4 \}}f_{l+1,r-1,i} \times [(s_{l}='(' \lor s_{l}='?') \land (s_{r}=')' \lor s_{r}='?')] \\ f_{l,r,2}=\sum\limits_{i=l}^{r-1}f_{l,i,3} \times f_{i+1,r,0} \\ f_{l,r,3}=f_{l,r,1}+\sum\limits_{i=l}^{r-1}(f_{l,i,2}+f_{l,i,3}) \times f_{i+1,r,1} \\ f_{l,r,4}=\sum\limits_{i=l}^{r-1}f_{l,i,0} \times f_{i+1,r,3} \end{cases}\) ,特判长度等于 \(1\)\(i=0\) 和长度等于 \(2\)\(i=1\) 的转移。

  • 最终有 \(f_{1,n,3}\) 即为所求。

    点击查看代码
    const ll p=1000000007;
    ll f[510][510][5];
    char s[510];
    int main()
    {
    	ll n,k,len,l,r,i;
    	cin>>n>>k>>(s+1);
    	for(i=1;i<=n;i++)
    	{
    		f[i][i][0]=(s[i]=='?'||s[i]=='*');
    	}
    	for(len=2;len<=n;len++)
    	{
    		for(l=1,r=l+len-1;r<=n;l++,r++)
    		{
    			f[l][r][0]=f[l][r-1][0]*((s[r]=='?'||s[r]=='*')&&len<=k);
    			if((s[l]=='('||s[l]=='?')&&(s[r]==')'||s[r]=='?'))
    			{
    				if(len==2)
    				{
    					f[l][r][1]=1;
    				}
    				else
    				{
    					f[l][r][1]=(f[l+1][r-1][0]+f[l+1][r-1][2]+f[l+1][r-1][3]+f[l+1][r-1][4])%p;
    				}
    			}
    			f[l][r][3]=f[l][r][1];
    			for(i=l;i<=r-1;i++)
    			{
    				f[l][r][2]=(f[l][r][2]+f[l][i][3]*f[i+1][r][0]%p)%p;
    				f[l][r][3]=(f[l][r][3]+(f[l][i][2]+f[l][i][3])*f[i+1][r][1]%p)%p;
    				f[l][r][4]=(f[l][r][4]+f[l][i][0]*f[i+1][r][3]%p)%p;
    			}
    		}
    	}
    	cout<<f[1][n][3]<<endl;
    	return 0;
    }
    

\(K\) luogu P8340 [AHOI2022] 山河重整

数学2(同余、计算几何、线性代数)

开题顺序: \(A\)

\(A\) luogu P3306 [SDOI2013] 随机数生成器

\(B\) luogu P3194 [HNOI2008] 水平可见直线

\(C\) luogu P4049 [JSOI2007] 合金

\(D\) luogu P9181 [COCI2022-2023#5] Zastave

\(E\) luogu P8885 「JEOI-R1」子序列

\(F\) luogu P7116 [NOIP2020] 微信步数

\(G\) CF963E Circles of Waiting

\(H\) CF1815E Bosco and Particle

\(I\) CF1067E Random Forest Rank

posted @ 2024-10-13 19:15  hzoi_Shadow  阅读(30)  评论(3编辑  收藏  举报
扩大
缩小