Codeforces Round #747 (Div. 2) Editorial

时间:2021-10-09
本文章向大家介绍Codeforces Round #747 (Div. 2) Editorial,主要包括Codeforces Round #747 (Div. 2) Editorial使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Codeforces Round #747 (Div. 2) Editorial

A. Consecutive Sum Riddle

思路分析:

  • 一开始想起了那个公式l + (l + 1) + … + (r − 1) + r = (l + r)(r - l + 1) / 2。
  • 然后一看令l + r = 1最合适,那么就有l = r - 1,一代入就得到r = n, l = -n + 1。
  • 没想通为什么没有一眼看出来。

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
        int t;
        cin >> t;
        while (t--)
        {
                ll n;
                cin >> n;
                cout << -n + 1 << ' ' << n << endl;
        }
        return 0;
}

B. Special Numbers

思路分析

  • 这题也是想久了,其实列一下规律一下就出来了(当然不排除大佬一眼看出来。
  • 我们列一下前几项吧。
  • k = 1,2,3,4,5,我们分别选的是n ^ 0,n ^ 1,n ^ 0 + n ^ 1,n ^ 2,n ^ 0 + n ^ 2。
  • 然后我们就可以得出一个规律,那就是我们把k变成二进制,如果当前二进制位为1的话我们就加上n ^ x,x是指该二进制位是第几位,然后注意longlong 和 取模即可。

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 1e9 + 7;
int main()
{
        ios::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
        int t;
        cin >> t;
        while (t--)
        {
                ll n, k;
                cin >> n >> k;
                ll ans = 0;
                ll p = 1;
                for (int j = 0; j <= 31; j++)
                {
                        if (k & (1 << j))
                        {
                                ans = (ans + p) % mod;
                        }
                        p *= n;
                        p %= mod;
                }
                cout << ans << endl;
        }
        return 0;
}

C. Make Them Equal

思路分析

  • 这题也挺简单的,很容易想到最多需要两次操作,因为1 <= x <= n,所以我们只要选n - 1和n必然能完成任务,因为选n就把除n这个位置以外的位置全部弄好了,然后就是n-1必然不会被n整除。
  • 所以我们就要思考一下只要一次操作和0次操作的情况。
  • 看下题目要求的时间,试试暴力(乌鱼子,我还想是不是质因数分解然后拿最小的质因数和n比大小,不知道有同学这样试了没)。
  • 暴力的时候注意一下o(n^2)是过不了这题的,所以我们以x为第一层循环,这样能优化时间。因为这样的话我们下标就不用一个一个遍历,只需要加上x即可。

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
        ios::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
        int t;
        cin >> t;
        while (t--)
        {
                vector<int> ans;
                bool ok = true;
                int n;
                cin >> n;
                char ch;
                cin >> ch;
                string s;
                cin >> s;
                for (int i = 0; i < s.size(); i++)
                {
                        if (s[i] != ch)
                        {
                                ok = false;
                        }
                }
                if (!ok)
                {
                        for (int i = 1; i <= n; i++)
                        {
                                ok = true;
                                for (int j = i; j <= n; j++)
                                {
                                        ok &= (s[j - 1] == ch);
                                        j += i - 1;
                                }
                                if (ok)
                                {
                                        ans.push_back(i);
                                        break;
                                }
                        }
                }
                if (!ok)
                {
                        ans.push_back(n);
                        ans.push_back(n - 1);
                }
                cout << ans.size() << endl;
                for (int x : ans)
                {
                        cout << x << ' ';
                }
                cout << endl;
        }
        return 0;
}

原文地址:https://www.cnblogs.com/csu-yuuki/p/15384823.html