codeforces#818(Div.2)
算了,不摆烂了,事情太多,没摆烂的时间了。在我研究出如何把某平台上多年积累的流量变现前,就继续用这个博客记录日常吧。之后所有内容基于时间,就懒得设置标签分类之类的了。
昨晚参加完卓工面试后,时隔两年,再次打了\(Div.2\),嗯,然后敲完\(A\)就睡着了没办法,刚军训完太累了辣……能在\(Div.2\)掉\(rating\)的也就只有我了……
今天班委选举,有趣的是,在一开始竞选班长环节,有一位同学半路杀出以绝对优势碾压死了我预估的竞选大核……班长竞选时有三人,一位是军训期间担任要职积累大量人脉的资历派,一位是闪现突脸成熟沉稳的保守派,一位是之前班会军训从未出席突然机械降神光芒四射不可名状但真的好活力好阳光的女性政治混沌派。嗯,然后班上那群老男人很有默契地把票全投给了这个第一次见面的女生。嗯,不错,很有精神,我大受震撼。我竞选的是团支书,能力和经历方面是没有问题的,为了保险,我甚至讲出了自己的童年往事来证明自己不怕苦累,虽然看起来像是在卖惨,当然,哥哥死在眼前的绝望、全家露宿桥洞、在其他人上幼儿园的年纪独自上街卖手工品艰难谋生那几年的委屈,我是决口不提的,提了就是对我这一路的侮辱。最终,嗯,顺利地与另一位同学平票了,然后,嗯,班助还是决定把团支书给他了……坏了,我成特朗普了。总结原因,毫无疑问,支持我的人是占相当比例的,可是,我的对手他所在一片皆为死党好友,无条件支持他,我是也觉得无可厚非的。反观我,前段时间,为了复习算法和准备项目,几乎整天都泡在图书馆,虽然军训间隙也有主动与人交流,但不凑巧的是聊熟的都是其他班的……大学学生竞选的特点是,感性主观(看女生漂亮就投人家的男人们ε=(´ο`*)))唉),重视人情关系。我并不觉得班委竞选投熟人有什么什么的,因为我也厚颜无耻地喊室友投我,只能怪自己在人际维藉上还是有所不足。同时,归于能力,我并没有相较对手特别出众的地方,那我那么高的票数何来呢?细思,还是那段无意间的“卖惨”。即使并非本心,在这种三四十人的场合博取同情,还真是可悲呢,我又一次感受到溯往灵魂深处的卑劣。小时候,什么都不懂,只是艰难地努力活着;中学时,什么都不说,害怕自己的曾经被人知晓后异样的揣度与目光;复读后,终于学会勇敢面对,又流于平静,像是嘉陵江岸的流萤;大学了,为了达成目的,我却都卑微到要拿以前逃避的事情作为谈资了吗?什么都没变,即使不再贫穷,我还是活得丑陋,和为了一枚五角硬币把手伸进排水井那时一样。可是,我是不会停下的,我不会放弃任何一个能改写命运的机会,即使明知能力不足,跌跌撞撞,丑态百出,我也会大声喊我能行,没人比我更懂***让我来。哪怕一次次出丑被嘲笑被鄙夷,我都舍弃颜面在下次孤注一掷,如是已是多年。今天在讲台上,我对同学们说:“我最大的优点是不要脸”,效果很好,他们都在笑。我没说的是,这就是我的生存之道,因为我曾一无所有,所以我一直视作自己一无所有,被命运所抛弃就拿命运作赌注,不过分吧=)
好,凌晨一点已到,网抑云时间结束,该记录今天的训练结果了,嗯,改了昨晚的\(Div.2\),然后没了:)
- A
打个表找规律就是
$click$ $for$ $codes$
//// gcd -> lcm
///*
//15 18
//3
//5 6
//a * b / gcd(a,b)
//
//a * b <= 3 * gcd(a, b) * gcd
//*/
//# include "bits/stdc++.h"
//using namespace std;
//int res[100000];
//int main() {
////freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
// for(int n = 1; n <= 500; ++n) {
// int ans = 0;
// for(int i = 1; i <= n; ++i) {
// for(int j = 1; j <= n; ++j) {
// int x = __gcd(i, j);
// if(x * x * 3 >= i * j) {
// ++ans;
// }
// }
// }
// res[n] = ans;
// printf("%d : %d\n", n, ans);
// }
//// int x;
//// while(cin >> x) {
//// cout << res[x] << endl;
//// }
//}
# include "bits/stdc++.h"
using namespace std;
int res[6] = {0, 1, 4, 7, 10, 11};
int main() {
int test;
scanf("%d", &test);
while(test--) {
int n;
scanf("%d", &n);
int d = n / 6;
long long ans = d * 16;
int r = n - d * 6;
printf("%lld\n", ans + res[r]);
}
}
- B
发现对角线最优,就基于对角线贪心
$click$ $for$ $codes$
# include "bits/stdc++.h"
using namespace std;
int main() {
int test;
scanf("%d", &test);
while(test--) {
int n, K, x, y;
scanf("%d%d%d%d", &n, &K, &x, &y);
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= n; ++j) {
if((i + j) % K == (x + y) % K) {
putchar('X');
}
else {
putchar('.');
}
}
putchar('\n');
}
}
return 0;
}
- C
草稿纸上推下什么情况能将\(a=>b\),很快也能想出规律
$click$ $for$ $codes$
# include "bits/stdc++.h"
using namespace std;
const int N = 2e5 + 3;
int a[N], b[N];
int main() {
int test;
scanf("%d", &test);
while(test--) {
int n;
// vector<int> a (n + 1), b (n + 1);
scanf("%d", &n);
for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
for(int i = 1; i <= n; ++i) scanf("%d", &b[i]);
bool flag = true;
for(int i = 1; i <= n; ++i) {
if(a[i] > b[i] || (a[i] < b[i] && b[i] - b[i % n + 1] >= 2)) {
flag = false;
break;
}
}
flag ? printf("YES\n") : printf("NO\n");
// vector<int>().swap(a);
// vector<int>().swap(b);
}
return 0;
}
- D
这题就有点意思了,但其实读懂题后可以剖析该题的本质。
首先,题目总节点数共\(2^{n}\)个,然后,已知\(sponsor\)与我们之间是绝对对立的,那么,他一定会绞尽脑汁让我们产生最大的结果,我们要做的,就是建好马奇诺防线,把最大的数都尽可能沿路拦截,这样,最终的结果就是所求。
懒得打字了,就找个大佬的解释贴下,不会真有人连这种题看了这个都不理解的吧?没错,就是在下,懵逼了好久
$click$ $for$ $codes$
``` # include "bits/stdc++.h" using namespace std; const int mod = 1e9 + 7; const int N = 1e5 + 3; int Pow(int x, int y) { int sum = 1; for(; y; y >>= 1, x = 1ll * x * x % mod) if(y & 1) sum = 1ll * sum * x % mod; return sum; } int fac[N], inv[N]; int C(int n, int m) { // return 1ll * fac[n] * Pow(fac[m], mod - 2) % mod * Pow(fac[n - m], mod - 2) % mod; // cout << fac[n] / (fac[m] * fac[n - m]) << " "; // if(n == m) return 1; return 1ll * fac[n] * inv[m] % mod * inv[n - m] % mod; } int main() { int n, k; scanf("%d%d", &n, &k); fac[0] = 1; for(int i = 1; i <= n; ++i) fac[i] = 1ll * fac[i - 1] * i % mod; inv[n] = Pow(fac[n], mod - 2); for(int i = n - 1; i >= 0; --i) inv[i] = 1ll * inv[i + 1] * (i + 1) % mod; // inv[1] = 1; // for(int i = 2; i <= n; ++i) inv[i] = (mod - mod / i) * inv[mod % i] % mod; int ans = Pow(2, n); for(int i = k + 1; i <= n; ++i) { ans = (ans - C(n, i) + mod) % mod; } printf("%d\n", ans); return 0; } /* 3 2 */ ```- E
首先,我们需要知道,线性求\(phi\)除开求质数过程,还能这么写
$calc$ $phi$
for(int i = 2; i <= n; ++i) {
if(!phi[i]) {
for(int j = i; j <= n; j += i) {
if(!phi[j]) phi[j] = j;
phi[j] = phi[j] / i * (i - 1) % mod;
}
}
}
- gcd(a, b) == gcd(a, a + b)
- if a⊥n, a⊥(n - a)
然后就是愉快地推式子:)
令\(d\)为\(n-c\)的约数
\(ANS=\)\(\sum{lcm(c,d)*\phi \frac{n - c}{d}}\)
$click$ $for$ $codes$
//# include "bits/stdc++.h"
//using namespace std;
//const int mod = 1e9 + 7;
//int gcd(int a, int b) {
// while(b ^= a ^= b ^= a %= b);
// return a;
//} //
//int main() {
// int n;
// scanf("%d", &n);
// long long sum = 0;
// for(int i = 1; i <= n; ++i) {
// for(int j = i + 1; i + j < n; ++j) {
// int k = n - i - j;
// int x = gcd(i, j);
// int y = gcd(k, x);
// sum += k * x / y;
// }
// }
//// cout << sum << endl;
// sum <<= 1;
// for(int i = 1; i <= n; ++i) {
// int k = n - (i <<1);
// if(k < 1) break;
// int y = gcd(k, i);
// sum += k * i / y;
// }
// printf("%lld", sum);
//}
# include "bits/stdc++.h"
using namespace std;
# define int long long
const int N = 1e5 + 3;
const int mod = 1e9 + 7;
//int phi[N];
int gcd(int a, int b) {
// a %= mod, b %= mod;
while(b ^= a ^= b ^= a %= b);
return a;
}
int phi[N];
vector<int> fac[N];
# undef int
int main() {
# define int long long
int n;
scanf("%d", &n);
// vector<int> phi(n + 1);
for(int i = 2; i <= n; ++i) {
if(!phi[i]) {
for(int j = i; j <= n; j += i) {
if(!phi[j]) phi[j] = j;
phi[j] = phi[j] / i * (i - 1) % mod;
}
}
}
// vector fac(n + 1, vector<int>());
for(int i = 1; i <= n; ++i) {
for(int j = i; j <= n; j += i) {
fac[j].push_back(i);
}
}
int ans = 0;
for(int c = 1; c < n - 1; ++c) {
for(int d : fac[n - c]) {
ans = (ans + c * d / gcd(c, d) % mod * phi[(n - c) / d] % mod) % mod;
}
}
printf("%lld", ans);
return 0;
}
- F
网络流,读论文去了,不写了