两日总结十五

比赛总结:

8.17牛客蔚蓝杯 :

那个J题差分的想法实在是太妙了,简直佩服,当时怎么我就没想到呢,哎。真的奇妙,天马行空。厉害厉害。

 登录—专业IT笔试面试备考平台_牛客网

#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那么轻松。

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值