總結——關於2017 10 27測試的分析總結

本文回顾了NOIP2017模拟赛经历,详细解析了三道题目的解题思路与技巧,包括暴力求解及数学推导等方法,并分享了比赛策略的心得体会。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NOIP 2017 模拟



10 27



前言:学校运动会,而我等蒟蒻又被困在机房考试,不亦悲乎。。。。



T1 :



题目:






——正解思路:


——我的乱搞:

和很多同学一样,第一题卡到十点,然后打个暴力走人。



——tips:


第一题以后还是不要花太多时间,说不定后面的题更呢,,,




满载悲伤的代码:


#pragma GCC optimize("O3")

#include <fstream>
#include <cstring>

char c[1000010];
int pos[2000000];
long long a[2000000], b[2000010];

int main () {
	int t, n, idx;
	scanf ("%d\n", &t);
	while (t--) {
		scanf ("%s", c + 1);
		n = strlen(c + 1);
		idx = 0;
		for (int i = 1; i <= n + n; i++) {
			if (c[(i - 1) % n + 1] == 'B') {
				pos[++idx] = i;
				a[idx] = a[idx - 1] + i;
			}
			b[i] = b[i - 1] + i;
		}
		long long ans = 1e+16;
		int shl = (idx / 2 - 1) >> 1, shr = idx / 2 - shl - 1;
		for (int i = shl + 1; i <= idx - shr; i++) ans = std::min (ans, b[pos[i]] - b[pos[i] - shl - 1] - a[i] + a[i - shl - 1] + a[i + shr]-a[i] - b[pos[i] + shr] + b[pos[i]]);
		printf ("%lld\n", ans);
	}
	return 0;
}




T2:


骗分骗样例,暴力出奇迹。

向连小样例都没过的AK da lao zc 同志低头



题目:



——正解思路:







——我的乱搞:

不断排序,选最大,累加。



——tips :

永远不要低估了出题人的考察范围,

就像去年神TM考了个概率DP一样。


满载悲伤的代码:


#pragma GCC optimize("O3")

#include <fstream>
#include <cstring>
#include <algorithm>

int n, k, x, y;
long long ans, g[20020], f[20020], q[20020], w[20020];

inline int read () {
	int i = 0;
	char c = getchar();
	while (!isdigit(c)) c = getchar();
	while (isdigit(c)) i = i * 10 + c - 48, c = getchar();
	return i;
}

int main () {
	n = read();
	k = read();
	for (int i = 1; i <= n; i++) {
		x = read();
		y = read();
		w[i] = y - x + 1;
	}
	for (int i = 1; i <= n; i++) f[i] = g[i] = w[i] * i;
	while (--k) {
		memset (f, 0, sizeof(f));
		memset (q, 0, sizeof(q));
		unsigned l = 0, r = 0;
		for (int i = 1; i <= n; i++) {
			while (l < r and g[q[l + 1]] - g[q[l]] > w[i] * (q[l + 1] - q[l])) ++l;
			while (l < r and (g[q[r]] - g[q[r - 1]]) * (i - q[r]) < (g[i] - g[q[r]]) * (q[r] - q[r - 1])) --r;
			f[i] = g[q[l]] + w[i] * (i - q[l]);
			q[++r] = i;
		}
		memcpy (g, f, sizeof(f));
	}
	for (int i = 0; i <= n; i++) ans = std::max(ans, f[i]);
	printf ("%lld", ans);
	return 0;
}




T3:







题目:


(由于题目过于中二,这里为了保护大家的眼睛,我连马赛克都不放了。。。反正都不会。。)


——正解思路:



——我的乱搞:

咦,划了N的范围,我们来手推几个吧。。。


——tips:

向数学势力低头。。。


满载悲伤的代码:

#pragma GCC optimize("O3")
#include <cstdio>
long long n, m, k, ans, a[200];
const long long mod = 1e+9 + 7;
inline long long pow (long long x, long long y) {
	x %= mod;
	long long ans = 1;
	while (y) {
		if (y & 1) ans = ans * x % mod;
		x = x * x % mod;
		y >>= 1;
	}
	return ans;
}
int main () {
	scanf ("%lld%lld", &n, &m);
	ans = pow(m, n);
	k = m;
	for (long long i = 2; i * i <= k; i++) if (!(k % i)) {
		a[++a[0]] = i;
		while (!(k % i)) k /= i;
	}
	if (k > 1) a[++a[0]] = k % mod;
	for(long long i = 1, tmp = 1, tot = 0; i < (1 << a[0]); i++, tmp = 1, tot = 0) {
		for (long long j = 1; j <= a[0]; j++) if(i & (1 << (j - 1))) ++tot, tmp *= a[j];
		ans += tot & 1 ?  -pow(m / tmp, n) : pow(m / tmp, n);
		(ans += mod) %= mod;
	}
	printf ("%lld", ans);
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值