Codeforces Round #747 (Div. 2) Editorial
阿新 • • 發佈:2021-10-09
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; }