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 表示序列长度,考虑统计 E(x)=i=1P(len=i)×i=i=1P(leni)=1+i=1P(len>i)

  • 再拆一下式子,有 i=1P(len>i)=i=1P(gcdj=1i{aj}>1)=i=11P(gcdj=1i{aj}1)=i=11a1=1ma2=1mai=1m[gcdj=1i{aj}=1]mi=i=11d=1mμ(d)a1=1m[d|a1]a2=1m[d|a2]ai=1m[d|ai]mi=i=11d=1mμ(d)mdimi=i=1d=2mμ(d)mdimi

  • 加上前面的 1 ,并交换枚举顺序,得到 1d=2mμ(d)i=1(mdm)i

  • 发现后面又是一个无限等比数列求和的形式,后面等于 mdm1mdm=mdmmd

  • 筛个莫比乌斯函数即可。

    点击查看代码
    const ll p=1000000007;
    ll prime[100010],vis[100010],miu[100010],len=0;
    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;
    }
    void isprime(ll n)
    {
    	memset(vis,0,sizeof(vis));
    	miu[1]=1;
    	for(ll i=2;i<=n;i++)
    	{
    		if(vis[i]==0)
    		{
    			len++;
    			prime[len]=i;
    			miu[i]=-1;
    		}
    		for(ll j=1;j<=len&&i*prime[j]<=n;j++)
    		{
    			vis[i*prime[j]]=1;
    			if(i%prime[j]==0)
    			{
    				miu[i*prime[j]]=0;
    			}
    			else
    			{
    				miu[i*prime[j]]=-miu[i];
    			}
    		}
    	}
    }
    int main()
    {
    	ll m,ans=1,i;
    	cin>>m;
    	isprime(m);
    	for(i=2;i<=m;i++)
    	{
    		ans=(ans-miu[i]*(m/i)*qpow(m-(m/i),p-2,p)%p+p)%p;
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    

F CF908D New Year and Arbitrary Arrangement

  • 以下所写 pa,pb 分别指原题的 papa+pb,pbpa+pb

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

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

  • 具体地,设 fi,j 表示放了 ia ,形成了 jab 子序列时的概率,状态转移方程为 {fi+1,j+=fi,j×pafi,i+j+=fi,j×pb ,边界为 f1,0=1

  • i+jk 时,可以直接统计期望累加在答案上。

  • 难点还是上述例子中的无限放 a 的可能,即难以处理 fk,j(j[0,k1]) 的贡献。

  • 考虑枚举多余 a 的数量,有 E(x)=fk,j(j+i=0paipb(k+i))=fk,j(j+k+pbi=0paii)

  • 把后面的 pbi=0paii=(1pa)i=0paii 提出来单独考虑,有 (1pa)i=0paii=i=0paiii=0pai+1i=i=0paiii=1pai(i1)=i=1pai

  • 发现这是个无穷递降等比数列求和的形式,又因为 |pa|<1 ,有 i=1pai=pa1pa=papb

    点击查看代码
    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

  • 猜测 i=1n(ni)ikn,k 是可以递推的。

  • fn,k=i=1n(ni)ik ,然后考虑把 (ni) 拆成 (n1i)+(n1i1)

  • 推式子,有 fn,k=i=1n(ni)ik=i=1n(n1i1)ik+i=1n(n1i)ik=i=1nin(ni)ik+i=1n1(n1i)ik=1ni=1n(ni)ik+1+fn1,k=1nfn,k+1+fn1,k

  • 移项得到 fn,k+1=n(fn,kfn1,k) ,用 k 代替 k+1 得到 fn,k=n(fn,k1fn1,k1)

  • 因为 k5000 ,分讨 n,k 的大小关系后类似阶梯状向下更新即可。边界为 {fn,0=i=1n(ni)=2n1n[1,n]f1,k=1k[0,k]

    点击查看代码
    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] 括号序列

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

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

    • i=0[l,r] 全部为 *
    • i=1l/r 分别为 ( / ),且 [l+1,r1] 是超级括号序列。
      • 左右直接被相互匹配的括号包裹,中间为超级括号序列。
    • i=2l/r 分别为 ( / *
      • 左边以括号序列开头,右边以 * 结尾,中间为超级括号序列。
    • i=3l/r 分别为 ( / )
      • 左边以括号序列开头,右边以括号序列结尾,中间为超级括号序列。
      • 包含了 i=1 的情况。
    • i=4l/r 分别为 * / )
      • 左边以 * 开头,右边以括号序列结尾,中间为超级括号序列。
  • 状态转移方程为 {fl,r,0=fl,r1,0×[rl+1k(sr=?sr=)]fl,r,1=i{0,2,3,4}fl+1,r1,i×[(sl=(sl=?)(sr=)sr=?)]fl,r,2=i=lr1fl,i,3×fi+1,r,0fl,r,3=fl,r,1+i=lr1(fl,i,2+fl,i,3)×fi+1,r,1fl,r,4=i=lr1fl,i,0×fi+1,r,3 ,特判长度等于 1i=0 和长度等于 2i=1 的转移。

  • 最终有 f1,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 @   hzoi_Shadow  阅读(44)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
扩大
缩小
点击右上角即可分享
微信分享提示