191108CSP模拟DAY2

今天这个题除了 T 3 T3 T3其实都不难,很多点都想到了,可就是没写出来,希望下次加油。

T1:药品试验

由题意可得 { a = ( 1 − α ) β b = ( 1 − α ) ( 1 − β ) + α β c = α ( 1 − β ) \left\{\begin{array}{l}{a=(1-\alpha) \beta} \\ {b=(1-\alpha)(1-\beta)+\alpha \beta} \\ {c=\alpha(1-\beta)}\end{array}\right. a=(1α)βb=(1α)(1β)+αβc=α(1β)

再化简递推式可得: p i + 1 = ( 1 − b ) p i − a p i − 1 c p_{i+1}=\frac{(1-b) p_{i}-a p_{i-1}}{c} pi+1=c(1b)piapi1

接下来我们设 p 1 = x p_1=x p1=x,可以用 k i x k_ix kix的形式表示 p 2 , p 3 , … , p 2 n p_{2}, p_{3}, \dots, p_{2 n} p2,p3,,p2n,因为我们已知 p 2 n p_{2n} p2n 1 1 1,则求出 k 2 n k_{2 n} k2n后,就可求出 x x x,又因我们已求出 k n k_n kn,所以乘上即为答案,复杂度 O ( n ) O(n) O(n)

当然我们也可用矩阵快速幂加速,复杂度 O ( 2 3 log ⁡ n ) O\left(2^{3} \log n\right) O(23logn)

还可以手写几组数据,可以发现 p n = c n c n + a n p_{n}=\frac{c^{n}}{c^{n}+a^{n}} pn=cn+ancn(大胆猜测,不用证明 )

下面是 l o b o q u i loboqui loboqui巨佬严谨的证明,体现了一个 o i e r oier oier真正有的样子,同样是 O ( l o g n ) O(logn) O(logn)的复杂度(以下来自 k m a kma kma巨佬);

由概率定义可得: a + b + c = 1 a+b+c=1 a+b+c=1,因为三件事情互斥;

变形得 a + c = 1 − b a+c=1-b a+c=1b

接着推理:

p i = a p i − 1 + b p i + c p i + 1 \quad p_{i}=a p_{i-1}+b p_{i}+c p_{i+1} pi=api1+bpi+cpi+1
∴ ( 1 − b ) p i = a p i − 1 + c p i + 1 \therefore(1-b) p_{i}=a p_{i-1}+c p_{i+1} (1b)pi=api1+cpi+1
∴ ( a + c ) p i = a p i − 1 + c p i + 1 \therefore(a+c) p_{i}=a p_{i-1}+c p_{i+1} (a+c)pi=api1+cpi+1
a ( p i − p i − 1 ) = c ( p i + 1 − p i ) a\left(p_{i}-p_{i-1}\right)=c\left(p_{i+1}-p_{i}\right) a(pipi1)=c(pi+1pi)

可得结论: p p p序列的差分序列有一些优秀的性质

d d d p p p的差分序列, k k k d d d的公比: a c \frac{a}{c} ca,即 d i + 1 d i = a c \frac{d_{i+1}}{d_{i}}=\frac{a}{c} didi+1=ca

接下来,求 p n p_n pn即求 ∑ i = 1 n d i \sum_{i=1}^{n} d_{i} i=1ndi,由等比数列求和公式可得

p 2 n = d 1 ∗ ( k n − 1 ) ( k n + 1 ) k − 1 = 1 p_{2 n}=d_{1} * \frac{\left(k^{n}-1\right)\left(k^{n}+1\right)}{k-1}=1 p2n=d1k1(kn1)(kn+1)=1
p n = d 1 ∗ 1 k n + 1 = p 2 n ∗ 1 k n + 1 = 1 k n + 1 p_{n}=d_{1} * \frac{1}{k^{n}+1}=p_{2 n} * \frac{1}{k^{n}+1}=\frac{1}{k^{n}+1} pn=d1kn+11=p2nkn+11=kn+11

∴ p n = k n − 1 k 2 n − 1 = k n − 1 ( k n + 1 ) ( k n − 1 ) = 1 k n + 1 = c n a n + c n \therefore p_{n}=\frac{k^{n}-1}{k^{2 n}-1}=\frac{k^{n}-1}{\left(k^{n}+1\right)\left(k^{n}-1\right)}=\frac{1}{k^{n}+1}=\frac{c^{n}}{a^{n}+c^{n}} pn=k2n1kn1=(kn+1)(kn1)kn1=kn+11=an+cncn

代码:

#include<bits/stdc++.h>
#define int long long
#define db double
#define re register
#define cs const
#define mod 1000000007
#define N 20000005
using namespace std;
inline int read()
{
	int x=0,f=1;
	char ch;
	while(ch>'9'||ch<'0')
	{
		if(ch=='-')	f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	return f*x;
}
int a,b,c;
int xx,yy,n;
int k[N];
int get(int x)
{
	return x==1?1:(mod-mod/x)*get(mod%x)%mod;
}
signed main()
{
	n=read();
	xx=read();
	yy=read();
	a=(mod+1-xx)*yy%mod;
	b=(xx*yy+(mod+1-xx)*(mod+1-yy)%mod)%mod;
	c=xx*(mod+1-yy)%mod;
	k[0]=0;
	k[1]=1;
	int inv=get(c);
	for(re int i=2;i<=2*n;++i)	k[i]=((mod+1-b)*k[i-1]+(mod-a)*k[i-2])%mod*inv%mod;
	printf("%lld",k[n]*get(k[2*n])%mod);
}

T2:小猫钓鱼

一道模拟不解释,可以用 S T L STL STL v e c t o r , d e q u e , l i s t vector,deque,list vector,deque,list等维护,但我 v e c t o r vector vector被卡了一下午, d e q u e deque deque不会用, l i s t list list z x y zxy zxy巨佬说会被 C C F CCF CCF的编译器卡爆,所以我用了 q u e u e queue queue储存手牌,手写队列储存出牌

代码:

#include<bits/stdc++.h>
#define ll long long
#define db double
#define re register
#define cs const
#define N 30005
using namespace std;
inline int read()
{
	int x=0,f=1;
	char ch;
	while(ch>'9'||ch<'0')
	{
		if(ch=='-')	f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	return f*x;
}
queue<int>q[N];
int n,m,l,s,T,b[N],a[105][105],mark[N];
int pos[N],d[N],head=1,tail=0,num;
int main()
{
	//freopen("a.out","w",stdout);
	while(1)
	{
		head=1;
		tail=0;
		num=0;
		memset(b,0,sizeof(b));
		memset(a,0,sizeof(a));
		memset(mark,0,sizeof(mark));
		memset(pos,0,sizeof(pos));
		n=read();	
		m=read();
		l=read();
		s=read();
		T=read();
		b[++num]=s;
		if(n==-1)	break;
		for(re int i=1;i<=n;++i)
			for(re int j=1;j<=l;++j)	a[i][j]=read(),b[++num]=a[i][j];
		sort(b+1,b+1+num);
		int numm=unique(b+1,b+1+num)-b-1;
		for(re int i=1;i<=n;++i)
		{
			for(re int j=1;j<=l;++j)
			{
				a[i][j]=lower_bound(b+1,b+1+numm,a[i][j])-b;
			}
		}
		s=lower_bound(b+1,b+1+numm,s)-b;
		for(int i=1;i<=n;++i)
			for(int j=1;j<=l;++j)  q[i].push(a[i][j]);
		num=n;
		for(int t=1;t<=T;++t)
		{
			if(num<=1)	break;
			for(re int i=1;i<=n;++i)
			{
				if(mark[i])	continue;
				int x=q[i].front();
				q[i].pop();
				if(head<=tail)
				{
					if(x==s)
					{
						for(re int j=head;j<=tail;++j)	q[i].push(d[j]),pos[d[j]]=0;
						q[i].push(x);
						head=1;
						tail=0;
					}
					else
					{
						if(pos[x])
						{
							int xxx=pos[x];
							for(re int j=xxx;j<=tail;++j)
							{
								q[i].push(d[j]);
								pos[d[j]]=0;
							}
							q[i].push(x);
							tail=xxx-1;	
						}
						else d[++tail]=x,pos[x]=tail;
					}
				}
				else	d[head=tail=1]=x,pos[x]=1;
				if(q[i].empty())  mark[i]=-t,num--;
			}
		}
		for(re int i=1;i<=n;++i)
		{
			if(mark[i])	printf("%d ",mark[i]);
			else printf("%d ",q[i].size());
		}
		putchar('\n');
		for(re int i=1;i<=n;++i)
		{
			while(!q[i].empty())	printf("%d ",b[q[i].front()]),q[i].pop();
			putchar('\n');
		}
	}
}

T3:迷雾华光

正解:虚树,树上分块,树上莫队;

好了,可以咕咕咕了(估计要等高二才能看懂);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值