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;
}
posted @ 2023-09-25 00:44  chfychin  阅读(46)  评论(0)    收藏  举报