今天这个题除了 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(1−b)pi−api−1
接下来我们设 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=1−b
接着推理:
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=api−1+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}
∴(1−b)pi=api−1+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=api−1+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(pi−pi−1)=c(pi+1−pi)
可得结论: 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=d1∗k−1(kn−1)(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=d1∗kn+11=p2n∗kn+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=k2n−1kn−1=(kn+1)(kn−1)kn−1=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:迷雾华光
正解:虚树,树上分块,树上莫队;
好了,可以咕咕咕了(估计要等高二才能看懂);