牛客小白赛 - 93 (3/7)

牛客小白赛 - 93

一 - 生不逢七

链接:https://ac.nowcoder.com/acm/contest/82401/A
来源:牛客网

题目描述

睡前游戏中最简单又最好玩的游戏就是这个啦!

​ 该游戏规则为:多名玩家轮流报数,当要报的数字中含有 7 或者是 7 的倍数时(例如 37,49),不能将该数报出来,要换一种提前规定好的方式报数,当一个人报错或者报慢了这个人就输了。

​ 我们认为玩家是围成一圈进行游戏的,第 n 个人报完数之后,会轮到第 1 个人报数。

现在告诉你玩家的总人数以及你上一个人报的数(用数字表示,即便这个数含有 7 或者是 7 的倍数),你需要预测接下来 kkk 轮你要报的数字,当你需要报的数字含有 7 或者是 7 的倍数时,你需要输出字符 p。

输入描述:

第一行一个整数 T,表示输入数据的组数。
接下来每组数据中均只有一行数据,每行三个整数 n,a,k,分别表示玩家数量,你的上一位玩家报的数,你需要模拟的游戏轮数。

输出描述:

共 T 行,每行输出 kkk 个整数或者字符 p。

示例1

输入

3
2 16 3
3 69 3
2 1 10

输出

p 19 p
p p p
2 4 6 8 10 12 p 16 18 20
//比较简单的模拟
#include<bits/stdc++.h>

using namespace std;

bool check(int x)
{
    if(x%7 == 0) return true;
    
    while(x)
    {
        int t = x%10;
        if(t == 7)
            return true;
        x /= 10;
    }
    return false;
}

int main()
{
    int t;
    cin >> t;
    
    while(t --)
    {
        int n, a, k;
        cin >> n >> a >> k;
        if(check(a+1)) cout << 'p' << " ";
        else cout << a+1 << " ";
        int b = k-1;
        while(b --)
        {
            int s = a+1;
            if(check(s+n))    cout << 'p' << " ";
            else cout << s+n << " ";
            a = s+n-1;
        }
        cout << endl;
    }
    return 0;
}

二 - 交换数字

链接:https://ac.nowcoder.com/acm/contest/82401/B
来源:牛客网

题目描述

Baijiaohu有两个长度均为 n 且不包含前导零的数字 a,b ,现在他可以对这两个数字进行任意次操作:

  1. 选择一个整数 1≤i≤n ,并交换 a,b 的第 i 位 。

请输出任意次操作后 a×b的最小值,由于答案可能很大,请对 998244353 取模。

输入描述:

第一行输入一个数字 n 代表两个数字的长度 
第二到三行输入两个字符串 a,b

输出描述:

输出一个 ans 表示最后的答案 
请对 998244353 取模

示例1

输入

3
159
586

输出

91884
#include<bits/stdc++.h>

using namespace std;

const int MOD = 998244353;

typedef long long LL;

int n;
string s1, s2;
LL a, b;

/*
vector<int> mul(vector<int> &A, vector<int> &B) {
    vector<int> C(A.size() + B.size());
    for (int i = 0; i < A.size(); i++) {
        for (int j = 0; j < B.size(); j++) {
            C[i + j] += A[i] * B[j];
        }
    }
    int t = 0;
    for (int i = 0; i < C.size(); i++) {
        t += C[i];
        C[i] = t % 10;
        t /= 10;
    }
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}

*/
int main()
{
    cin >> n;
    cin >> s1 >> s2;
    
    /*
    for(int i=s1.size()-1; i>=0; i--)
    {
        if(s1[i] > s2[i])
        {
            a.push_back(s1[i] - '0');
            b.push_back(s2[i] - '0');
        }
        else 
        {
            a.push_back(s2[i] - '0');
            b.push_back(s1[i] - '0');
        }
    }
    
    for(int i=0; i<a.size(); i++)
        cout << a[i] << " ";
    cout << endl;
     for(int i=0; i<a.size(); i++)
        cout << b[i] << " ";
    cout << endl;
    */
    /*
    vector<int> result = mul(a, b);
    long long ans = 0;
    for(int i = result.size() - 1; i >= 0; i--)
    {
        ans = ans*10 + result[i];
    }
    cout << ans;
    
    
    vector<int> result = mul(a, b);
    long long ans = 0;
    for(int i = result.size() - 1; i >= 0; i--)
    {
        ans = ans*10 + result[i];
    }
    cout << ans % MOD;
    */
    
    for(int i = 0; i<n; i++)
    {
        if(s1[i] > s2[i]) swap(s1[i], s2[i]);
        a = (a*10 + (s1[i] - '0')) % MOD; //在转化类型和分类时 进行 MOD; (a*b)%p == (a%p)*(b%p)%p !!!
        b = (b*10 + (s2[i] - '0')) % MOD;
    }
    
    LL ans = a * b % MOD;
    
    cout << ans << endl;
    
    return 0;
}

三 - 老虎机

链接:https://ac.nowcoder.com/acm/contest/82401/C
来源:牛客网

题目描述

老虎机游玩规则:共有三个窗口,每个窗口在每轮游玩过程中会等概率从图案库里选择一个图案,根据最后三个窗口中图案的情况获得相应的奖励。

你有一个老虎机,你可以设定这个老虎机图案的数量和收益规则。

现在你设定了图案的数量为 m,没有相同的图案得 a 元,一对相同的图案 b 元,三个相同的图案 c 元。

​ 想知道在你设定的规则下,单次游玩期望收益是多少?答案对 99824435 取模。

​ 根据 逆元 的定义,如果你最后得到的答案是形如 ab\frac{a}{b}ba 的分数,之后你需要对 ppp 取模的话,你需要输出 (a×bmod−2)  来保证你的答案是正确的。

输入描述:

第一行一个整数 T(1≤T≤10^4)
接下来T 行,每行四个整数 m,a,b,c(1≤m,a,b,c≤10^6)

输出描述:

一个整数表示答案,答案对 998244353 取模。

示例1

输入

1
2 2 3 4
748683268

知识点:费马小定理 — p为质数时,b^p = b (mod p )

推论:模数 p 为 质数时, b^p-2 就是 b 乘法逆元

#include<bits/stdc++.h>

using namespace std;

#define int long long

typedef long long LL;
const int MOD = 998244353;

int m, a, b, c, t;

int qmi(int m, int k, int p) //快速幂
{
    int res = 1, t = m;
    while(k)
    {
        if(k&1) res = res * t % p;
        t = t * t % p;
        k >>= 1;
    }
    return res;
}

int get(int x)
{
    LL p = MOD;
    return qmi(x, p-2, p); //求逆元
}

signed main()
{
    cin >> t;
    
    while(t --)
    {
        cin >> m >> a >> b >> c;
        LL sum = m * m % MOD * m % MOD;
        LL a2 = 3LL * m * (m - 1) % MOD, a3 = m; //两种和三种的有几种方式
        LL ans = a2 * b + a3 * c + (sum - a2 - a3) * a; //期望
        ans = (ans % MOD + MOD) % MOD; //防止出现负数
        ans = ans * get(sum) % MOD;
        cout << ans << endl;
    }
    
    return 0;
}
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值