- #2004. 「SDOI2017」硬币游戏
答案
- 2023-3-22 19:42:29 @
嘿嘿嘿!这一道题目也太简单了吧!我来公布答案吧!
#include <bits/stdc++.h>
const int mod1 = 1e9 + 7;
const int mod2 = 1e9 + 9;
const int N = 305;
char s[N][N]; double ex[N], f[N][N];
int a[N], p1[N], p2[N];
int pre1[N][N], pre2[N][N], suf1[N][N], suf2[N][N];
int n, m;
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
scanf("%s", s[i] + 1);
ex[0] = 1;
for (int i = 1; i <= m; ++i)
ex[i] = 0.5 * ex[i - 1];
p1[0] = p2[0] = 1;
for (int i = 1; i <= m; ++i)
{
p1[i] = 29ll * p1[i - 1] % mod1;
p2[i] = 31ll * p2[i - 1] % mod2;
}
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= m; ++j)
a[j] = s[i][j] == 'T' ? 5 : 7;
for (int j = 1; j <= m; ++j)
{
pre1[i][j] = (29ll * pre1[i][j - 1] + a[j]) % mod1;
pre2[i][j] = (31ll * pre2[i][j - 1] + a[j]) % mod2;
}
for (int j = 1; j <= m; ++j)
{
int tmp = m - j + 1;
suf1[i][j] = (1ll * p1[j - 1] * a[tmp] + suf1[i][j - 1]) % mod1;
suf2[i][j] = (1ll * p2[j - 1] * a[tmp] + suf2[i][j - 1]) % mod2;
}
}
for (int i = 1; i <= n; ++i)
{
f[i][i] = 1.0;
for (int j = 1; j <= n; ++j)
for (int k = 1; k < m; ++k)
if (suf1[j][k] == pre1[i][k] && suf2[j][k] == pre2[i][k])
f[i][j] += ex[m - k];
f[i][n + 1] -= ex[m];
}
for (int i = 1; i <= n; ++i)
f[n + 1][i] = 1.0;
f[n + 1][n + 2] = 1.0;
++n;
for (int i = 1; i <= n; ++i)
{
int p = i;
for (int j = i + 1; j <= n; ++j)
if (fabs(f[p][i]) < fabs(f[j][i]))
p = j;
if (p != i)
{
for (int j = i; j <= n + 1; ++j)
std::swap(f[p][j], f[i][j]);
}
double tmp = f[i][i];
for (int j = i; j <= n + 1; ++j)
f[i][j] /= tmp;
for (int j = 1; j <= n; ++j)
if (j != i)
{
tmp = f[j][i];
for (int k = i; k <= n + 1; ++k)
f[j][k] -= tmp * f[i][k];
}
}
for (int i = 1; i < n; ++i)
printf("%.10lf\n", f[i][n + 1]);
}
代码有些长,请耐心观看。
0 条评论
目前还没有评论...
信息
- ID
- 185
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 2
- 已通过
- 2
- 上传者