首页 > 其他分享 >Atcoder ABC298 D-F

Atcoder ABC298 D-F

时间:2024-08-01 17:51:10浏览次数:8  
标签:Atcoder 取模 int ABC298 ans dq dp mod

Atcoder ABC298 D-F

D - Writing a Numeral

链接:

D - Writing a Numeral (atcoder.jp)

简要题意:

  • 问题陈述

    我们有一个字符串 \(S\) 。初始值为 \(S=\) 1.
    按以下格式依次处理 \(Q\) 查询。

    • 1 x:在 \(S\) 的末尾添加一个数字 \(x\) 。
    • 2:删除 \(S\) 开头的数字。
    • 3 : 以十进制形式打印 \(S\) 所代表的数字,取模 \(998244353\) 。

思路:

  • 我们直接用双端队列模拟题目中的操作
  • 注意点是删除s开头的字符,这边的删除是取模意义下的,所以总结答案时候要加上模数再取模
  • 两个取模的结果进行相减操作时(易知前面的数理论上应该大,但取模之后可能小于后面的数)此时应该加上MOD的倍数,再对相减结果进行取模,从而保证输出为正

代码:

const int N = 200005;
ll powerMod(ll x, ll n, ll mod){ //快速幂
    ll ans = 1;
    while (n > 0){
        if  (n & 1)
            ans = (ans * x) % mod;
        x = (x * x) % mod;
        n >>= 1;
    }
    return ans;
}
void solve(){
    int q;
    cin >> q;
    int mod = 998244353;
    deque<int> dq;
    dq.push_back(1);
    int ans = 1;
    while(q--){
        int op;
        cin >> op;
        if(op==1){
            int x;
            cin >> x;
            dq.push_back(x);
            ans = (ans*10%mod + x)%mod;
        }else if(op==2){
            int sz = dq.size();
            ans=(ans - dq.front()*powerMod(10,sz - 1,mod)%mod +mod)%mod;
            dq.pop_front();
        }else{
            cout << ans <<endl;
        }
    }
}

E - Unfair Sugoroku

链接:

E - Unfair Sugoroku (atcoder.jp)

简要题意:

  • 问题陈述

    高桥从 \(A\) 点开始,青木从 \(B\) 点开始。他们将轮流掷骰子。
    高桥的骰子显示 \(1, 2, \ldots, P\) ,概率相同;青木的骰子显示 \(1, 2, \ldots, Q\) ,概率相同。
    当在 \(x\) 点的棋手掷出骰子,结果显示 \(i\) 时,他就会下到 \(\min(x + i, N)\) 点。
    最先到达点 \(N\) 的棋手获胜。
    求高桥先下的概率,模为 \(998244353\) 。

思路:

  • 数据量很小,又是求概率所以一眼dp

  • 设置 $$dp[i][j][0/1] $$ 表示 先手走到$$i$$这个地方 后手走到$$j$$ 这个地方,当前是先手走还是后手走的概率

  • 用刷表法dp

  • 最后统计a在n位置上的 b在其他合法位置的总概率累加和

  • 注意开long long 笔者是define int long long的

代码:

int mod = 998244353;
int ksm(int x,int n){
    int res = 1;
    while(n){
        if(n&1) res = res*x%mod;
        x = x*x%mod;
        n>>=1;
    }
    return res;
}
int iv(int i){
    return ksm(i,mod - 2);
}
void solve(){
    int n,a,b,p,q;
    cin >> n >> a >> b >> p >> q;
    int dp[n + 1][n + 1][2]; //1先手,0后手
    memset(dp,0,sizeof dp);
    dp[a][b][1] = 1;
    for(int i = a;i< n;i++){
        for(int j = b;j < n;j++){
            for(int k = 0;k<=1;k++){
                if(k){
                    for(int t = 1;t<=p;t++){
                        dp[min(i+t,n)][j][0] = (dp[min(i+t,n)][j][0] + dp[i][j][1]*iv(p)%mod)%mod;
                    }
                }else{
                    for(int t = 1;t<=q;t++){
                        dp[i][min(j+t,n)][1] = (dp[i][min(j+t,n)][1] + dp[i][j][0]*iv(q)%mod)%mod;
                    }
                }
            }
        }
    }
    int ans = 0;
    for(int i = b;i<n;i++){
        ans = (ans + dp[n][i][0])%mod;
    }
    cout << ans <<endl;
}

F - Rook Score

贪心 待补

标签:Atcoder,取模,int,ABC298,ans,dq,dp,mod
From: https://www.cnblogs.com/bananawolf/p/18337194

相关文章

  • 每日一题——A - Max/Min AtCoder - abc356_e
    1.题目大意:枚举两个数的Max/Min向下取整之和。2.思路:一开始并没有想时间复杂度问题发现通过sort()排序来遍历每个最小值Min和后面最大值的和就是题目答案。你会发现仍然有问题,那就是取整的问题你就必须要优化然后发现很明显超时了。现在我们来换一个角度思考。搭配前缀和嘛。为......
  • Atcoder ABC297 E-G
    AtcoderABC297E-GE-KthTakoyakiSet链接:E-KthTakoyakiSet简要题意:问题陈述有\(N\)种章鱼烧出售。一个\(i\)-种的章鱼烧售价为\(A_i\)日元。高桥总共至少会买一个章鱼烧。他可以购买多个同类章鱼烧。求高桥可能支付的\(K\)个最低价格。在这里,如果有多......
  • Solution - Atcoder AGC052B Tree Edges XOR
    令\(w_{(u,v)}\)为边\((u,v)\)的边权。考虑到对于一条边进行操作影响的是有公共点的边,于是一个想法是把边权转到点权,用点权来表示边权。于是考虑对于每个点构造\(w_u\)使得\(w_{(u,v)}=w_u\oplusw_v\)。因为这是一颗树,所以一定存在合法的构造。其实到了这里,这种......
  • Atcoder ABC296 F
    AtcoderABC296FF-SimultaneousSwap链接:F-SimultaneousSwap(atcoder.jp)简要题意:问题陈述给你两个\(N\)数字序列:\(A=(A_1,A_2,\ldots,A_N)\)和\(B=(B_1,B_2,\ldots,B_N)\)。高桥可以重复下面的操作任意多次(可能为零)。在\(1\)和\(N\)之间选择三......
  • Atcoder 356 C - Keys 二进制枚举
    原题链接:https://atcoder.jp/contests/abc356/tasks/abc356_c C-Keys:问题陈述您有 N 个编号为1,2,…,N 的密钥。其中一些是真钥匙,其他都是假钥匙。有一扇门,门X,你可以插入任意数量的钥匙。只有插入至少 K 把真钥匙,X门才会打开。你已经对这些钥匙进行了 M 次......
  • Solution - Atcoder APC001E Antennas on Tree
    首先考虑判定什么样的选取是合法的。考虑到令任意一个点\(u\)为根。若\(u\)有至少两个子树没有点选中,那么这两个子树是无法区分的。所以可以知道需要满足任意一个点为根,都至多存在一个子树内部没有选中的点。接下来就要贪心的选出最少的点了。考虑对于每个点的限制都是子......
  • Solution - Atcoder AGC028B Removing Blocks
    因为贡献的方法是相加,一种想法就是拆开,对每一项单独贡献。不难发现这题目中的贡献其实只涉及到两点之间。即删除\(x\)时\(y\)也产生了贡献。考虑这个贡献会在多少种排列中出现。令\(d=|x-y|+1\),即\(x,y\)中的点数。能发现排列需要满足除\(x\)外的\(d-1\)......
  • Atcoder ABC364 D-F
    AtcoderABC364D-FD-K-thNearest链接:D-K-thNearest(atcoder.jp)简要题意:问题陈述在一条数线上有\(N+Q\)个点\(A_1,\dots,A_N,B_1,\dots,B_Q\),其中点\(A_i\)的坐标为\(a_i\),点\(B_j\)的坐标为\(b_j\)。请就每个点\(j=1,2,\dots,Q\)回答下面的问题:......
  • Solution - Atcoder YPC2019E Odd Subrectangles
    首先对于\(0/1\)和为奇数,转化为异或为\(1\)来考虑。考虑如果已经确定了行的选取,又该如何计数。考虑对于每一列,都处理好在对应行的位置的异或值。然后记\(\operatorname{c}_0,\operatorname{c}_1\)表示列异或值为\(0/1\)的数量。知道了\(\operatorname{c}_0,\op......
  • Solution - Atcoder UTPC2023P Priority Queue 3
    考虑找一些关于合法的\(X\)加入的数的判定条件。假设遇到了一个\(\operatorname{pop}\)操作,令这里删除的数为\(a_i\),显然\(X\)中的数应该要有\(a_i\),其次\(X\)中其他的加入的数要么\(>a_i\)要么是\(a\)中的元素(在前面的\(\operatorname{pop}\)就已经被删了)。于......