1. 程式人生 > 其它 >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;
}