比赛总结:
8.17牛客蔚蓝杯 :
那个J题差分的想法实在是太妙了,简直佩服,当时怎么我就没想到呢,哎。真的奇妙,天马行空。厉害厉害。
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n;
cin >> n;
vector<int> a(n), cha(n);
for (int i = 0; i < n; i ++) cin >> a[i];
for (int i = 0; i < n; i ++) {
cha[i] = (a[(i + 1) % n] + 3 - a[i]) % 3;
}
int one = 0, tow = 0;
for (int i = 0; i < n; i ++) {
if (cha[i] == 1) one ++;
else if (cha[i] == 2) tow++;
}
if (one >= tow) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
int main() {
int T;
cin >> T;
while (T --) {
solve();
}
return 0;
}
8.16
这一场题目比较好,就是难度跨越不是特别大,收获满满。。。。。
暴力容斥模板,DFS比二进制枚举时间要少。。
// u 表示下标
//state表示乘积
//cnt 多少数的乘积
// ans 表示答案
// zhi 表示容斥的数组
inline void dfs(ll u, ll state, ll cnt) {
// 安排完n个数
if (u == len) {
// 选了0个数
if (cnt == 0) {
return;
// 至少选了一个数
} else {
if (cnt % 2 == 1) {
ans += n / state;
} else {
ans -= n / state;
}
}
return;
}
// 剪枝
if (state > n) {
return;
}
// 选
dfs(u + 1, state * zhi[u], cnt + 1);
// 不选
dfs(u + 1, state, cnt);
return;
}
然后就是 1到 n与 l,r都互质的个数求法!!!
#include <bits/stdc++.h>
#define OST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define ll long long int
#define ull unsigned long long int
using namespace std;
const ll mod = 998244353;
const int N = 1e7 + 10;
bool vis[N];
vector<int> prime, zhi;
set<int> st;
ll ans = 0;
ll n, q, len;
inline void getPrime() {
vis[0] = vis[1] = 1;
for (int i = 2; i < N; i++) {
if (!vis[i]) {
prime.push_back(i);
}
for (auto x : prime) {
if (x * i >= N)
break;
vis[i * x] = 1;
if (i % x == 0)
break;
}
}
}
inline void get(int n) {
int tmp = n;
for (auto x : prime) {
if (!vis[n]) {
st.insert(n);
break;
}
if (x > n && x > sqrt(tmp)) {
break;
}
if (n % x == 0) {
st.insert(x);
while (n % x == 0) {
n /= x;
}
}
}
}
inline void dfs(ll u, ll state, ll cnt) {
// 安排完n个数
if (u == len) {
// 选了0个数
if (cnt == 0) {
return;
// 至少选了一个数
} else {
if (cnt % 2 == 1) {
ans += n / state;
} else {
ans -= n / state;
}
}
return;
}
// 剪枝
if (state > n) {
return;
}
// 选
dfs(u + 1, state * zhi[u], cnt + 1);
// 不选
dfs(u + 1, state, cnt);
return;
}
int main(int argc, char const *argv[]) {
// OST;
getPrime();
// cin >> n >> q;
scanf("%d %d", &n, &q);
while (q--) {
int l, r;
// cin >> l >> r;
scanf("%d %d", &l, &r);
if (__gcd(l, r) == 1) {
// cout << 1 << " " << 1 << endl;
puts("1 1");
continue;
}
st.clear();
zhi.clear();
get(l), get(r);
for (auto x : st) {
zhi.push_back(x);
}
if (zhi.size() == 0) {
puts("1 1");
continue;
}
len = st.size();
ans = 0;
dfs(0, 1, 0);
// cout << 2 << " " << n - ans << endl;
printf("%d %d\n", 2, n - ans);
}
return 0;
}
然后就是CF一场,这一场有点怪怪的。那个1真的容易忽略。。
补题:
其他的CF1700刷题:刷的话有时候会卡题目,有点难受,没有1600那么轻松。