首页 > 其他分享 >Codeforces 441E Valera and Number

Codeforces 441E Valera and Number

时间:2024-02-28 19:22:19浏览次数:19  
标签:Valera 舍弃 int f128 tot Codeforces calc 441E times

首先看到 \(\times 2\) \(+1\) 和最后答案的计算方式,能想到看成二进制来处理。

考虑到 \(\times 2\) 就是在最后加了一个 \(0\)。
不妨倒过来看,\(\times 2\) 就相当于舍弃了最低位。

于是可以考虑 \(\text{DP}\),\(f_{i, j}\) 为考虑后面的 \(i\) 个操作,目前 \(+\) 的值为 \(j\) 的概率。
那么如果上一步选择 \(+1\),概率就为 \(f_{i - 1, j - 1}\times (1 - p)\)。
如果上一步是 \(\times 2\),就需要看最后一位是 \(0\) 还是 \(1\),似乎不好处理最后的答案。
但是因为如果舍弃的最后一位为 \(1\),后面末尾的 \(0\) 就一定不会算上贡献。

于是进一步完善 \(\text{DP}\) 状态的含义:记 \(f_{i, j}\) 为考虑后 \(i\) 个操作加的值为 \(j\) 且目前舍弃掉的位都保证为 \(0\) 的方案数。
首先 \(+1\) 的转移是不变的,\(f_{i - 1, j - 1}\times (1 - p)\)。
\(\times 2\) 就只需要考虑末尾为 \(0\) 的情况转移过来,贡献为 \(f_{i - 1, 2j}\times p\)。
同时因为这一位舍弃的 \(0\) 一定能记入答案,考虑直接把这部分贡献提前记入答案。

对于 \(f_{k, i}\),相当于到最后还剩了 \(+ i\),便还有的贡献为 \(f_{k, i}\times \operatorname{calc}(x + i)\),\(\operatorname{calc}(x)\) 为 \(x\) 末尾连续的 \(0\) 的个数。

时间复杂度 \(O(k^2)\)。

#include<bits/stdc++.h>
using f128 = long double;
const int maxk = 2e2 + 10;
int calc(int w) {
    int tot = 0;
    while (~ w & 1) w >>= 1, tot++;
    return tot; 
}
f128 f[maxk][maxk * 2];
int main() {
    int x, k; f128 p; scanf("%d%d%Lf", &x, &k, &p);
    p /= 100;
    f[0][0] = 1;
    f128 ans = 0;
    for (int i = 1; i <= k; i++)
        for (int j = 0; j <= k; j++) {
            if (j) f[i][j] += f[i - 1][j - 1] * (1 - p);
            f[i][j] += f[i - 1][j * 2] * p, ans += f[i - 1][j * 2] * p;
        }
    for (int i = 0; i <= k; i++) ans += f[k][i] * calc(x + i);
    printf("%.10Lf\n", ans);
    return 0;
}

标签:Valera,舍弃,int,f128,tot,Codeforces,calc,441E,times
From: https://www.cnblogs.com/rizynvu/p/18041507

相关文章

  • Codeforces 1705F Mark and the Online Exam
    先问全\(\texttt{T}\),记得到的数为\(a\)。接下来问\(len\)个位置为\(\texttt{T}\),得到的数为\(b\)。因为剩下\(n-len\)个位置肯定都会被刚好算上一次,对于这\(len\)个数里的\(\texttt{T}\)的个数\(x\)就有式子\((n-len)+2x=a+b\),可以解得\(x=\frac{......
  • Codeforces 286E Ladies' Shop
    考虑\(p_i\)满足什么不会被选。令当前选出来的\(p_j\)的集合为\(S\)。能发现当用\(S\)中的数能够凑(可多选,可选重)出\(p_i\)时\(p_i\)就不会被选。考虑凑出\(p_i\)的最后一步所用的\(2\)个数\(x+y=p_i\)。因为这\(2\)个数一定能被\(S\)中的数凑出且题目......
  • Codeforces Round 909 (Div
    CodeforcesRound909(Div.3)A.GamewithIntegers显然就是还要不是三的倍数就能赢!intn; cin>>n; intk; while(n--) { cin>>k; if(k%3==0){ cout<<"Second"<<endl; }else{ cout<<"First"<<endl; } }B......
  • Codeforces Round 905 (Div
    CodeforcesRound905(Div.3)A.Morning此题将其看为光标一直移动,其中移动次数就是坐标之差的绝对值,0看做10,由于其显示也需一次操作,所以加上四。#include<bits/stdc++.h>usingnamespacestd;intmain(){ intt; cin>>t; while(t--) { intarr[4],count=0; ......
  • Codeforces Round 900 (Div
    CodeforcesRound900(Div.3)A.HowMuchDoesDaytonaCost?这个题简单,在子段上最常见的元素其实只要这个元素出现就行intt; cin>>t; intn,k; while(t--) { cin>>n>>k; intarr[n]; intout=0; for(inti=0;i<n;i++) { cin>>arr[i]; } for(......
  • Codeforces Round 888 (Div
    CodeforcesRound888(Div.3)A.EscalatorConversations推导即可,判断条件就是abs(h[i]-H)%k==0&&abs(h[i]-H)/k<m&&h[i]!=H,先要整除再能相隔abs(h[i]-H)/k个台阶谁高谁矮任意不影响,但是最后这个我就没注意到h[i]!=H小卡一会。#include<bits/stdc++.h>usingnamespacestd;......
  • Codeforces 1906L Palindromic Parentheses
    考虑先判定有无解对应的\(k\)的范围。首先若\(k=n\)一定无解,因为字符串开头是\(\texttt{(}\)结尾是\(\texttt{)}\)匹配不上。下界因为各有\(\frac{n}{2}\)个\(\texttt{()}\),所以可以先猜测下界就为\(\frac{n}{2}\)。考虑构造到这个下界。能发现只需要形如\(\te......
  • Educational Codeforces Round 162 (Rated for Div. 2)
    Preface开学了没时间组队训练就抽空把之前欠下的CF补一补这场当时玩《拔作岛》上头了忘记有比赛了,等想起来的时候已经快结束了就没现场打赛后补题发现A~E都很简单,F的话一个地方没太想清看了题解才会A.MovingChips签到,找一个极小的且包含了所有\(1\)的区间,这个区间中\(0\)......
  • Codeforces 1451F Nullify The Matrix
    因为保证了这个路径必须是向下和向右,就可以考虑每一条\(i+j=x\)的斜线上的点,因为一条路径经过的点对应的\(i+j\)一定是每次\(+1\)的。考虑到因为对于同一条直线,每个点是独立的,因为一条路径至多经过这条直线上的一个点。于是可以考虑用\(\text{Nim}\)的思想把这条......
  • CF1923 Educational Codeforces Round 162 (Rated for Div. 2)
    C.FindB给出一个数组A,对于q个询问,每个询问给出[l,r],对于A的子数组[l,r],问是否存在一个相同大小的数组B,使得两个数组的和相同,且任意相同下标的元素不同?Solution:A中任意一个大于1的元素,可以把他变成1,多余的那部分给到其他位置的元素上(如最后一个)对于等于1的元素,把......