2023河南萌新联赛第(三)场
C. 计数问题(因素相乘相等,递推+dp)

输入
4
输出1
8
说明
八种方案分别为(1,1,1,3),(1,1,3,1),(1,2,1,2),(1,2,2,1),(1,3,1,1),(2,1,1,2),(2,1,2,1),(3,1,1,1)
输入2
1
输出2
0
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
int n, x, m, ans;
int f[N];
void solve()
{
cin >> n;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= i / j; j ++)
if(i % j == 0)
{
f[i] ++;
if(i / j != j) f[i] ++;
}
for(int i = 1; i <= n; i ++)
ans += f[i] * f[n - i];
cout << ans << "\n";
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
while(T --)
solve();
return T ^ T;
}
D. AND and SUM(数学推理)

输入
2
1 8
4 2
输出
Yes
No
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
int a, s, ans, n;
void solve()
{
cin >> a >> s;
if(a > s)
{
puts("No");
return;
}
n = s - a;
ans = n & a;
if(ans == a) puts("Yes");
else puts("No");
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
cin >> T;
while(T --)
solve();
return T ^ T;
}
F. 数学题(高幂次,欧拉函数)

输入
3 2
输出
65535
点击查看代码
#include<bits/stdc++.h>
#define int long long
int mod = 998244353;
inline int quick_pow(int a,int b,int res = 1)
{
a %= mod;
while(b)
{
if(b & 1) res = res * a % mod;
a = a * a %mod;
b >>= 1;
}
return res;
}
inline int inv(int a)
{
return quick_pow(a, mod - 2);
}
void solve()
{
int n,x; std :: cin >> n >> x;
if(x % mod == 1)
{
std :: cout << quick_pow(2, n + 1);
return;
}
mod--;
int res = quick_pow(2, n + 1);
mod++;
int f = (quick_pow(x,res)-1+mod) % mod;
int z = inv(x - 1);
std :: cout << f * z % mod << '\n';
}
signed main()
{
int loveelegy = 1;
// std :: cin >> loveelegy;
while(loveelegy--) solve();
}
H. 真 X 简单版本(二进制组合数)

输入1
4
1 2 4 9
输出1
8
输入2
9
6 5 23 6 1 90 3 2 47
输出2
184
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
int n, a[N], s[N], ans;
void solve()
{
cin >> n;
for(int i = 1; i <= n; i ++)
cin >> a[i];
sort(a + 1, a + n + 1);
for(int i = 1; i <= n; i ++)
s[i] = s[i - 1] + a[i];
for(int i = 1; i <= n; i ++)
if(s[i - 1] < a[i] - 1)
{
cout << s[i - 1] + 1 << "\n";
return ;
}
cout << s[n] + 1 << "\n";
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
while(T --)
solve();
return T ^ T;
}
K. 替换大师(模拟)

输入
10
xx(a,b)c,d
输出
xx(a.b)c,d
说明
xx和c,d位于括号外部,a,b位于括号内部。你需要将ab中间的逗号替换为句号并输出。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
int n;
string s;
void solve()
{
cin >> n >> s;
int l = 0, r = 0;
for(int i = 0; i < n; i ++)
{
if(s[i] == '(')
l ++;
else if(l > 0&&s[i] == ',')
s[i] = '.';
else if(s[i] == ')')
l --;
}
cout << s << "\n";
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int T = 1;
// cin >> T;
while(T --)
solve();
return T ^ T;
}
L. 泰拉瑞丽(贪心)

输入1
1 10
3 5
输出1
3
说明
只有一把回旋镖,你可以先打两次伤害为3的,再打一次倾尽全力的,造成的伤害为5。总伤害为3+3+5=11,即可获得胜利。
输入2
2 100
1 30
1 20
输出2
52
说明
你可以先把第一把倾尽全力打出去,造成30伤害。接下来用第二把连续攻击50次,造成50伤害。最后把第二把也打出去,造成20伤害。总伤害为30+50+20,即可击杀。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 10;
int a[N];
void solve()
{
int n, m, mx = 0, x, sum = 0, ans = 0;
cin >> n >> m;
for(int i = 0; i < n; i ++)
cin >> x >> a[i], mx = max(mx, x);
vector<int> s;
for(int i = 0; i < n; i ++)
if(a[i] > mx) s.push_back(a[i]);
sort(s.rbegin(), s.rend());
for(int i = 0; i < s.size(); i ++)
{
sum += s[i];
if(sum >= m)
{
cout << i + 1 << "\n";
return ;
}
}
cout << (m - sum + mx - 1) / mx + s.size() << "\n";
}
signed main()
{
int T = 1;
while(T --)
solve();
return T ^ T;
}

浙公网安备 33010602011771号