TypeDB Forces 2023 (Div. 1 + Div. 2, Rated, Prizes!)(A-C)题解

A.Exponential Equation

题意:给我们一个n,让我们找到任意的一对(X,Y)满足X^Y*Y + Y^X*X = n

思路:我们很容易(困难)发现相加的两个式子是对称的,因此我们就心生一记,是否可以让两部分都相等,并且等于n/2,我们的问题就转化成为了X^Y*Y  = n/2这时候我们一般就会把Y设为1,这样我们的X就等于n/2了,那么又出现另一个问题了,-1的情况是怎么出现的?

我们对原式子分析,如果x是偶数,y是奇数,那么我们会得到   偶数*奇数 + 奇数*偶数这样结果n还是一个偶数,当x和y都是偶数的时候 n也一定是偶数,当x和y都是奇数的时候  我们会得到奇数*奇数 + 奇数*奇数 = 偶数,因此我们会发现n的取值只有偶数是可以实现的,奇数的话直接输出-1即可。

具体代码:

#include <bits/stdc++.h>

using namespace std;

#define endl '\n'
typedef pair<int, int> pii;
typedef long long ll;
typedef unsigned long long ULL;
const int N = 1e6 + 10, P = 131;
ll f[N][4];
ll d[N][4];
int a[N];
int n, s;

void solve()
{
    int n;
    cin >> n;
    if (n % 2 != 0)
    {
        cout << -1 << endl;
    }
    else
    {
        cout << 1 << " " << n / 2 << endl;
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}

B.Number Factorization

题意:给我们一个n,通过因式分解我们可以将其变成A1^b1*A2^b2*......,让我们找到∑ai⋅bi的最大值?

思路:看到n的这个式子上来我就想到了因式分解,可是又出现了一个问题,如何我们可以让ai*bi最大呢,我们写几个式子看一下

100 =  10^2                    ∑ai⋅bi = 2*10 =20

100 =  2^2 * 5^2             ∑ai⋅bi = 2*2 +5*2 =14

5^2*2^2 = (5*2)*(5*2)就得到了我们上面的最大值

我们会发现当我们分解的越深入的时候我们所求得的∑ai⋅bi的值就会越小,因此我们将所有的bi都设置为1的时候我们所求的值就会是最大的,让后我们尽可能多的将我们分出来的质因数相乘()本质上就是让次幂等级相同的质因数都乘起来,这样我们就可以尽可能的变大我们的底数,来扩大我们的结果),这时候我们就会得到最大的值。

代码如下:

#include <bits/stdc++.h>

using namespace std;

#define endl '\n'
typedef pair<int, int> pii;
typedef long long ll;
typedef unsigned long long ULL;
const int N = 1e6 + 10, P = 131;

void solve()
{
    int n;
    cin >> n;
    vector<pii> cnt;
    for (int i = 2; i <= n / i; i++)
    {
        if (n % i == 0)
        {
            int s = 0;
            while (n % i == 0)
                n /= i, s++;
            cnt.push_back({i, s});
        }
    }
    if (n > 1)
        cnt.push_back({n, 1});

    int maxx = 0;
    for (int i = 0; i < cnt.size(); i++)
        maxx = max(maxx, cnt[i].second);

    vector<int> res(maxx, 1);
    for (int i = 0; i < cnt.size(); i++)
    {
        for (int j = 0; j < cnt[i].second; j++)
        {
            res[j] *= cnt[i].first;
        }
    }

    ll ans = 0;
    for (int i = 0; i < maxx; i++)
    {
        ans += res[i];
    }

    cout << ans << endl;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}

C.Remove the Bracket

题意:

RSJ有一个由n个整数组成的序列a,即a1,a2,…,an,以及一个整数s。对于a2,a3,…,an−1,他选择了一对非负整数xi和yi,满足xi+yi=ai且(xi−s)⋅(yi−s)≥0。

现在他对值F感兴趣,其中 F=a1⋅x2+y2⋅x3+y3⋅x4+…+yn−2⋅xn−1+yn−1⋅an。 请帮助他通过选择xi和yi的最佳值来找到可能的最小值F。可以证明总是至少有一种有效的选择方式。

思路:这个题赛时就没做出来,赛时感觉是一个dp,但是一直退出来,状态转移的时候一直都有点小问题,赛后看了一下大佬的做法,发现雀氏巧妙,具体的讲解看这位大佬的讲解吧(线性DP——TypeDB Forces 2023 (Div. 1 + Div. 2, Rated, Prizes)——C. Remove the Bracket_北岭山脚鼠鼠的博客-CSDN博客)讲解的很详细也很清楚。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值