====== 2019 Multi-University Training Contest 2 ======
===== 比赛情况 =====
^题号 ^A ^B ^C ^D ^E ^F ^G ^H ^I ^J ^K ^L |
^状态 |- |O |- |- |O |- |- |O |Ø |O |O |O |
//O 在比赛中通过 Ø 赛后通过 ! 尝试了但是失败了 - 没有尝试//
**比赛时间**
2020-07-09 13:00-18:00
**提交记录**
===== 题解 =====
==== E - Everything Is Generated In Equal Probability ====
给一个伪代码,然后给出一个 $N(N\le3000)$ ,等概率的生成一个数 $n\in [1,N]$,再等概率生成 $n$ 的一个排列,让这个排列执行伪代码中的函数,问结果的期望是多少。
推,就硬推。考虑 $n$ 一定时,存在 ${ n \choose 2}$ 个逆序对,每个逆序对出现的概率为 $\frac 12$,按照上述函数每个逆序对对期望的贡献为:$\sum_{i=0}^\infty \frac 1{4^i}=\frac 43$,所以总的期望为 ${n \choose 2}\frac12\frac43=\frac{n(n-1)}3$。最后对每个 $n$ 乘 $\frac1N$再相加即可。
#include
#define ll long long
#define pii_ pair
#define mp_ make_pair
#define pb push_back
#define fi first
#define se second
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define show1(a) cout<<#a<<" = "<>=1;}return s; }
ll res[3005];
void init()
{
int n = 3000;
ll inv3 = qpow(3,M-2);
rep(i,1,n){
res[i] = i*(i-1)%M*inv3%M;
}
}
int main()
{
fastio();
init(); int n;
while(cin>>n){
ll ans = 0;
rep(i,1,n){
ans = (ans + res[i])%M;
}
ans = ans * qpow(n,M-2) % M;
cout<
\\
==== I - I Love Palindrome String ====
给一个字符串,对 $i\in [1,|S|]$ ,统计有多少子串满足长度为 $i$ 、自身是一个回文串,该子串的前半段也是个回文串。
回文自动机求出所有回文串,字符串哈希看是否前半部分等于后半部分。
#include
#define ll long long
#define ull unsigned long long
#define pii_ pair
#define mp_ make_pair
#define pb push_back
#define fi first
#define se second
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define show1(a) cout<<#a<<" = "<>s+1){
pam.init();
pam.solve(s);
}
return 0;
}
\\
===== replay =====
===== 比赛总结 =====