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;
}