7.21test
今天考试了, 考了好几道题 依次为:
矩阵乘法
代码: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using namespace std;
const int N = 502, mod = 1e9+7;
int n, p, m;
int f1[N][N], f2[N][N];
int f3[N][N];
inline int work (int x, int y) {
int res = 0;
for (int i = 1; i <= p; ++ i) {
res += (f1[x][i]*f2[i][y])%mod;
res %= mod;
}
if (res >= 0) return res%mod;
if (res < 0) return (res+mod)%mod;
}
main () {
cin >> n >> p >> m;
for (int i = 1; i <= n; ++ i)
for (int j = 1; j <= p; ++ j)
cin >> f1[i][j];
for (int i = 1; i <= p; ++ i)
for (int j = 1; j <= m; ++ j)
cin >> f2[i][j];
for (int i = 1; i <= n; ++ i)
for (int j = 1; j <= m; ++ j)
f3[i][j] = work(i, j);
for (int i = 1; i <= n; ++ i) {
for (int j = 1; j <= m; ++ j)
cout << f3[i][j] << ' ';
cout << '\n';
}
return 0;
}
但是我考试的时候,没开\(longlong\), \(res\)没有中途取模
就是\(zero\)了....
大炮
代码: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using namespace std;
const int N = 6e6;
int n, k, T;
int js[N];
inline int ksm (int a, int b) {
if (b == 0) return 1%mod;
if (b&1) return a*ksm(a, b-1)%mod;
int tmp = ksm(a, b/2)%mod;
return tmp*tmp%mod;
}
inline int C (int n, int m) {
if (m > n) return 0;
return (js[n]*ksm(js[m],mod-2))%mod*ksm(js[n-m], mod-2)%mod;
}
inline int lucas (int n, int m) {
if (!m) return 1;
return C (n%mod, m%mod)*lucas(n/mod, m/mod)%mod;
}
inline int calc(int n, int k) {
int res = 0, t = 0;
for (int i = 0; i <= k; ++i) {
t = lucas(n, i)%mod;
res += t;
res %= mod;
}
return res%mod;
}
signed main() {
cin >> T;
while (T-- > 0) {
cin >> n >> k;
js[0] = 1;
for (int i = 1; i <= mod; ++i)
js[i] = (js[i - 1] * i) % mod;
cout << calc(n, k) << '\n';
}
return 0;
}
这个数据比较**正好卡我百分之五十的数据,也就是说,不动脑子,敲Lucas板子的话,可以拿到百分之五十的数据
但是我就是不会推 也不想去推
这种操蛋数学题,正如郑好学长所言,爱练不练的,考的几率没准,简单的大家都会,难的大家都不会
第三题
\(Description\)
桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。
\(Input\)
一行输入两个数R,B,其值在0到5000之间
\(Output\)
在最优策略下平均能得到多少钱
\(Sample\) \(Input\)
5 1
\(Sample\) \(Output\)
4.166666
\(HINT\)
输出答案时,小数点后第六位后的全部去掉,不要四舍五入.
代码: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using namespace std;
const int N = 1e5+66;
double R, B, res;
long long nows;
double f[6][6666];
int main() {
cin >> R >> B;
for (int i = 0; i <= R; ++ i, nows ^=1, f[nows][0] = i)
for (int j = 1; j <= B; ++ j)
f[nows][j] = max(0*1.0,
1.0 * i/(i + j)*(f[nows ^ 1][j]+1)
+ 1.0 * j/(i + j)*(f[nows][j - 1]-1));
res = f[nows^1][(int)B];
long long z = res*10000000;
long long k = z%10;
z -= k;
double ans = (double)z/10000000;
printf ("%.6lf", ans);
return 0;
}
\(f[i][j]\)表示选\(i\)张红的\(j\)张黑色的答案
卡内存所以需要滚动数组
\(f[i][j]\) = \(max\)(\(0,\dfrac{i}{i*j}*(f[i-1][j]+1)+\dfrac{j}{i*j}*(f[i][j-1]-1))\)
奶牛去搬砖
1 |
|
建个图,跑一跑,完事。可是考试时候的我,连题目都没看懂什么意思(英文题面, 教练给翻译了,但是感觉那个翻译看起来很不爽,索性没有做)
但是这个题真的很简单,就是需要一步很巧妙的回退思想 \(add(i+1, i, 0)\):建一条权值为零的回退的边
1 3
4 5
虽然没有交集,但是上述情况是可以满足题意的
所以建边的时候要\(add(u,v+1,w)\)
单位错选
1 |
|
假设第\(i\)个题目的选项数是\(a[i]\),那么\(gx\)做对这道题目的概率就是\(\dfrac{min(a[i],a[i-1])}{a[i]*a[j]}\)
\(i == 1\)的时候特判 然后把每个题做对的概率加起来就好了
其实说实话,我还是感觉不太理解 也说不出来哪里不明白
可能是初次接触概率的题吧,这是个锅,以后得补上
互相伤害
1 |
|
状压dp
\(f[i][j][k]\)表示我们当前摆放棋子摆到了第\(i\)行的时候(包括前\(i\)行)当前第\(i\)行的状态为\(j\),并且一共用了\(k\)个国王所呈现出的方案数
又因为i行之前的状态方案数都是互不影响的,所以说,是“或”的关系,根据加法原理,可以直接相加
所以转移方程可以写出来:
\(f[i][j][k] += f[i-1][z][k-Work(j)]\)
自此所有题目分析完毕
\(7.28update\)
关于第二题大炮,看了看题解,还是不会推
给出ac代码
1 | // da pao |