首页 > 其他分享 >牛客周赛 Round 30

牛客周赛 Round 30

时间:2024-01-30 14:34:19浏览次数:25  
标签:int ll 30 long 牛客 solve using Round define

牛客周赛 Round 30

A

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;

void solve()
{
    string s;
    cin >> s;
    for (int i = 0; i < 3; i++)
    {
        if (i != 1)
        {
            cout << s[i];
        }
    }
}

int main()
{
    int t = 1;

    // cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}

B

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;

void solve()
{
    int x;
    cin >> x;
    vector<int> cnt(12);
    while (x)
    {
        int t = x % 10;
        cnt[t]++;
        x /= 10;
    }
    ll ans = 0;
    for (int i = 1; i <= 9; i++)
    {
        if (cnt[i] > 0)
        {

            cnt[i]--;
            ans = i;
            break;
        }
    }
    for (int i = 0; i <= 9; i++)
    {
        while (cnt[i] > 0)
        {
            cnt[i]--;
            ans = ans * 10 + i;
        }
    }
    cout << ans << endl;
}

int main()
{
    int t = 1;

    // cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}

C

解题思路:

找到半边不同的两个字符,两半边对应交换位置。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;

void solve()
{
    string s;
    cin >> s;
    int n = s.size();
    vector<int> vis(40, -1);
    int cnt = 0;
    for (int i = 0; i < (n) / 2; i++)
    {
        if (vis[s[i] - 'a'] == -1)
        {
            vis[s[i] - 'a'] = i;
            cnt++;
        }
    }
    // cout << cnt << endl;
    if (cnt > 1)
    {
        int a = 0;
        int b = 0;
        for (int i = 0; i < 26; i++)
        {
            if (!a && !b && vis[i] != -1)
            {
                a = vis[i];
            }
            else if (!b && vis[i] != -1)
            {
                b = vis[i];
                break;
            }
        }
        // cout << a << ' ' << b << ' ' << endl;
        swap(s[a], s[b]);
        swap(s[n - 1 - a], s[n - 1 - b]);
        cout << s << endl;
    }
    else
    {
        puts("-1");
    }
}

int main()
{
    int t = 1;

    // cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}

D

解题思路:

先统一转换为乘法:\(,g = gcd(x,y),x = x \div g,y = y \div g\)

乘法上边界:\(\lfloor \frac{r}{y}\rfloor\)

乘法下边界:\(\lceil \frac{l}{x} \rceil\)

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;

int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}

void solve()
{
    int x, y, l, r;
    cin >> x >> y >> l >> r;
    int g = gcd(x, y);
    x /= g;
    y /= g;
    if (x > y)
    {
        swap(x, y);
    }
    int ans = max(0, (r / y) - ((l + x - 1) / x) + 1);
    cout << ans << endl;
}

int main()
{
    int t = 1;

    // cin >> t;

    while (t--)
    {
        solve();
    }

    return 0;
}

E

解题思路:

\(f[i][0]:以结点i为根节点的子树,结点i染色为白色的方案数\)。

\(f[i][1]:以结点i为根节点的子树,结点i染色为红色的方案数\)。

\(f[u][0] = \prod\limits_{v \in son[u]} f[v][1]\)

\(f[u][1] = \prod\limits_{v \in son[u]}(f[v][0] + f[v][1])\)

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
ll f[N][2];
void solve()
{
    int n;
    cin >> n;
    vector<vector<int>> adj(n + 1, vector<int>());
    for (int i = 1; i < n; i++)
    {
        int a, b;
        cin >> a >> b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    auto dfs = [&](auto self, int u, int fa) -> void
    {
        f[u][0] = f[u][1] = 1;
        for (auto v : adj[u])
        {
            if (v == fa)
            {
                continue;
            }
            self(self, v, u);
            f[u][0] = f[u][0] * f[v][1] % mod;
            f[u][1] = f[u][1] * (f[v][1] + f[v][0]) % mod;
        }
    };
    dfs(dfs, 1, -1);
    cout << (f[1][0] + f[1][1]) % mod;
}

int main()
{
    int t = 1;

    // cin >> t;

    while (t--)
    {
        solve();
    }

    return 0;
}

F

解题思路:

注意,\(a,b\)的取值只有\(1,2\)。

\(f[i][j]:小红还有i个1,小紫还有j个1时的期望\)。

四种情况:\((1,1),(1,2),(2,1),(2,2)\),我们对应概率为\(p_{11},p_{12},p_{21},p_{22}\)

\(f[i][j] = (p_{11} + p_{22}) \times f[i][j] + p_{12}\times f[i - 1][j] + p_{21} \times f[i][j -1] +1\)。

对方程进行化简,即可得到状态转移方程:

\(f[i][j] = \frac{p_{12} \times f[i-1][j] + p_{21} \times f[i][j-1] + 1}{1 - p_{11}-p_{22}}\)

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
const int mod = 1e9 + 7;
const int N = 55;
ll f[N][N];

ll qmi(ll a, ll b)
{
    ll res = 1;
    while (b)
    {
        if (b & 1)
        {
            res = res * a % mod;
        }
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}

void solve()
{
    int n, m;
    cin >> n >> m;
    int a = 0;
    int b = 0;
    for (int i = 1; i <= n; i++)
    {
        int x;
        cin >> x;
        a += x == 1;
    }
    for (int i = 1; i <= m; i++)
    {
        int x;
        cin >> x;
        b += x == 1;
    }
    for (int i = 0; i <= a; i++)
    {
        for (int j = 0; j <= b; j++)
        {
            if (i == 0 && j == 0)
            {
                continue;
            }
            ll pa1 = i * qmi(n - (a - i), mod - 2) % mod;
            ll pa2 = (n - a) * qmi(n - (a - i), mod - 2) % mod;
            ll pb1 = j * qmi(m - (b - j), mod - 2) % mod;
            ll pb2 = (m - b) * qmi(m - (b - j), mod - 2) % mod;
            // 11,22
            ll p = ((pa1 * pb1 % mod) + (pa2 * pb2 % mod)) % mod;
            p = (1 - p + mod) % mod;
            p = qmi(p, mod - 2);
            f[i][j] = (f[i][j] + p) % mod;
            if (i)
            {
                ll tp = pa1 * pb2 % mod;
                f[i][j] = (f[i][j] + ((tp * f[i - 1][j] % mod) * p % mod)) % mod;
            }
            if (j)
            {
                ll tp = pa2 * pb1 % mod;
                f[i][j] = (f[i][j] + ((tp * f[i][j - 1] % mod) * p % mod)) % mod;
            }
        }
    }

    cout << f[a][b] << endl;
}

int main()
{
    int t = 1;

    // cin >> t;

    while (t--)
    {
        solve();
    }

    return 0;
}

标签:int,ll,30,long,牛客,solve,using,Round,define
From: https://www.cnblogs.com/value0/p/17997033

相关文章

  • 【2024.01.30】闪光灯漫展实践操作
    在漫展时候使用机顶闪的时候我常常觉得人物的曝光太大了即使是光圈开到100也是很亮结果后面基本上都是使用自然光进行拍摄场照的话,只有一项数值是固定的,光圈调到最大这样子的背景是虚化比较好看的,光会被打成好看的圆形所以我一般使用半自动光圈优先的挡位,然后ISO调整到100然......
  • 1月30日(外包杯第一阶段成果验收)
    赛题:【A25】基于大模型语料库问答背景:首先介绍一下赛题的背景,通用型大型语言模型(LLM)已经在许多任务上取得了令人瞩目的成果。一些开源的大模型知识分布虽然很全面,但是在许多特定的垂直业务领域中,由于其与通用领域之间存在较大差异,直接采用开源的通用型LLM经常无法满足该领域应用......
  • 牛客周赛 Round 29
    C题:用桶处理字符串重排小红拿到了一个字符串,其中一定包含连续子串"xiao",和连续子串"hong"。请你将字符串重排,使得该字符串包含"xiaohong"的连续子串。较简单的做法:遍历字符串,给每个字符放到相应的桶中,然后先先输出目标字符串xiaohong,同时对桶进行相对应的调整。最后再按任意顺......
  • 算法模板 v1.5.1.20240130
    算法模板v1.1.1.20240115:之前的历史版本已经不可寻,创建了第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”与“编译”-“手动开O优化”;将“编译”-“CF模板”中的第20行代码cin>>T;注释;删除“读写”及其目录下的内容;删除“图论”-“欧拉图”-“混合图”;删除“图论”-......
  • 【2024潇湘夜雨】WIN11_Pro_23H2.22631.3085软件选装纯净版1.29
    【系统简介】=============================================================1.本次更新母盘来自WIN11_Pro_23H2.22631.3085。2.增加部分优化方案,手工精简部分较多。3.OS版本号为22631.3085。精简系统只是为部分用户安装,个别要求高的去MSDN下。4.集成《DrvCeo-2.16.0.0》网卡版、......
  • 网工内推 | 申通快递急招网安、测试工程师,包食宿,30k*13薪
    01申通快递招聘岗位:信息安全工程师职责描述:1、负责集团数据安全风险的识别、协同、跟踪、改进优化及事后评估;2、负责集团数据安全专项风险的治理及系统上线前的数据安全评审;3、负责集团信息安全、合规等方面制度的编写、更新、迭代;4、负责集团数据安全个人信息保护落地合规工......
  • P10114 [LMXOI Round 1] Size 题解
    题目链接:[LMXOIRound1]Size挺有意思的诈骗题,其实这类题都喜欢批一个外壳,例如数据范围提示之类的。记得以前遇到的很多诈骗题,有一道cf的高分题,问的是区间出现次数的次数\(mex\),这玩意一开始感觉好难,出现次数还简单,还要考虑次数的次数,所以带修莫队的时候,一直没法确定怎么解决......
  • Codeforces Round 921 (Div. 2)
    目录写在前面ABCDE写在最后写在前面比赛地址:https://codeforces.com/contest/1925。在床上躺了两天终于复活了妈的。A发现字符串\(s\)合法当且仅当\(s\)可以被分为至少\(n\)段,其中每段都包含\(k\)种字符至少1次。正确性可以归纳证明,这里懒得写了感性理解下。于是......
  • P8306 【模板】字典树
    P8306【模板】字典树字典树树简介字典树英文名为\(Trie\)树,就是像字典一样的树。字典树树正文我们建一棵树,边表示字母和数字,节点表示根到此节点的字符串,假设有某个点,其子节点表示在这个字符串上再加一个字母的字符串。那么这样如何解决这道题呢?首先我们要根据题目给定的......
  • 牛客小白月赛86
    B水平考试======等价于两个集合\(S,T\)判断\(S\)中是否存在\(T\)中所不包含的元素。若存在则输出0;否则输出10。时间复杂度:\(O(T)\)C题:区间查询当前区间可以被分为多少段,要求每段只有一种数字。做法1:提前对所有段编号,查询时直接左右边界编号相减,注意边界需要特......