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博客)讲解的很详细也很清楚。