K.First Last

签到题

题意

$n$ 个人参加 $m$ 场比赛,每场比赛中获得名次得概率均等
问针对某一人,他在所有场次比赛中都获得第一或倒数第一的概率

解题思路

如果人数 $n>1$ ,每场比赛的概率是 $p=\dfrac{2}{n}$ ;人数为 $1$ 时 $p=1$

输出 $p^m$ 即可

参考代码

1
2
3
4
5
6
7
8
void solve()
{
ll m,n;cin >> n >> m;
double p=2./n,re=1;
if(n==1) p=1;
FORLL(i,1,m) re*=p;
print_float(re,15);cout << endl;
}

M.Fair Equation

模拟

题意

给定一个式子 $A+B=C$ ,其中正整数 $A,B,C\le 10^6$
问能否在 $A,B,C$ 其中一个数的某一位置(可以是开头和结尾)插入一个数字,使得等式成立;或原式自然成立。
若成立,输出成立的等式

解题思路

如题如题目所述,取出等式中的数字,逐位模拟即可。具体实现可参考代码

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void print_equal(){
cout << YES;
cout << num[0] << " + " << num[1] << " = " << num[2] << endl;
}
void solve()
{
string s;getline(cin,s);
get_nums(s);ll t;//分离出数字
if(num[0]+num[1]==num[2]) {print_equal();return ;}//原式成立
FORLL(i,0,9){
FORLL(k,0,numlen[0]){
t=(num[0]/pow_10[k])*pow_10[k]*10+i*pow_10[k]+num[0]%pow_10[k];
if(t+num[1]==num[2]) {num[0]=t;print_equal();return ;}
}//在A的第k位插入i,判断是否符合条件,下面同理
FORLL(k,0,numlen[1]){
t=(num[1]/pow_10[k])*pow_10[k]*10+i*pow_10[k]+num[1]%pow_10[k];
if(num[0]+t==num[2]) {num[1]=t;print_equal();return ;}
}
FORLL(k,0,numlen[0]){
t=(num[2]/pow_10[k])*pow_10[k]*10+i*pow_10[k]+num[2]%pow_10[k];
if(num[0]+num[1]==t) {num[2]=t;print_equal();return ;}
}
}cout << NO;
}