记在期末考试和退役之前

···二是严格制定录取标准,高校在现有基础上进一步降低给予自主招生考生的优惠分值。三是严格控制招生规模,高校在上一年录取人数基础上适度压缩招生名额。

人生真的好难啊。

今天下午 PKUWC 2019 和 THUWC 2019 的签约结果就会发布,尽管这跟我这个蒟蒻无关。但是在新政发布之后,这两个比赛的签约结果意味着之后竞赛生自主招生的政策走向,直接决定我是否退役。光凭一腔热血完全不够,功利化的因素仍然需要放在第一位。

这三个星期,我一直都泡在文化课的学习上,除了偶尔想想 crazydave 给的神仙题之外,没有怎么碰 OI。期末考试很重要,由于对于上一次考试翻车,这一次必须要证明自己的脑子是没有问题的。

可能真的要对 OI 说再见了,尽管我不知道为什么我们这个地区的年轻人要活的这么累。

文化课啊,我颓爆

文化课好像比较简单

学了两个月的 OI 感觉整个人智商回到了平均水平,回附中之后感觉文化课相对于 OI 那些什么毒瘤的虚树之类的要容易得多。看了一些书把一些基本的知识补了回来,但是没做题还是非常的亏。

没做题吃亏主要体现在生物、化学和数学上(对基本上全炸,物理不知道为什么现在还行,跟大佬比肯定菜的一笔),之后就安排搞课外书和作业,在两个星期内整个进度都跟上了。不过还是做不到每个科目做 2 本课外书…这个真的做不到。

还剩下一周,准备周六通宵颓选择题,周日写大题…提高速度才是坠吼的。感觉需要有人陪我一起肝才行,指不定就睡着了。

但是难啊

文化课并不考察人的智力,而是考察熟练程度。要把有一点落下的 6 门瞬间补起来还是比较困难的,况且我的 OI 也落下了很多。面对新的政策,这一段时间只能这样了。只能眼睁睁看着别人在属于神仙的天上遨游。

P3773:「CTSC2017」吉夫特题解

神仙思路

有一个“显然”的定理:如果满足\(n\&k==k\),那么\(C^k_n\)为奇数。具体感性证明:litble 的证明。所以,直接上代码。

代码

// P3773.cpp
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX_N = 233393, mod = 1000000007;
int n, arr[MAX_N], bucket[MAX_N], f[MAX_N], ans;
int getMod(int num) { return num >= mod ? num - mod : num; }
int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d", &arr[i]), bucket[arr[i]] = i;
    for (int i = n; i >= 1; i--)
    {
        f[i] = 1;
        for (int j = (arr[i] & (arr[i] - 1)); j; j = arr[i] & (j - 1))
            if (bucket[j] > i)
                f[i] = getMod(f[i] + f[bucket[j]]);
        ans = getMod(ans + f[i]);
    }
    ans = (ans - n + mod) % mod;
    printf("%d", ans);
    return 0;
}

鄙人之代码规范

大体的几条规则

  1. 大括号换行(至少在 C 系语言里是这样的,JavaScript 随意,但是我没有见过谁竞赛用 JavaScript)
  2. 尽量用题目里的变量名。
  3. 临时变量(比如说遍历变量)可以用一个字母或者是两位字母缩写来命名。
  4. 全局变量、生成周期长的字段尽量小驼峰命名。
  5. 函数、函数变量命名使用小驼峰。
  6. 赋值的构造函数、初始化的函数一行搞定(比如说初始一条边或者是并查集初始化)
  7. 少用 #define,多用 const。
  8. 循环里或者是条件语句中用逗号压行(不要过长)。
  9. 使用现代编辑器进行自动格式化(墙裂安利 VSCode,告别 F**K 调试法)。

示例代码:

// snippet.cpp
#include <iostream>
#include <cstdio>
using namespace std;
const int MAX_N = 100;
int n, seqa[MAX_N], seqb[MAX_N], ans;
int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d", &seqa[i]), scanf("%d", &seqb[i]);
    for (int i = 1; i <= n; i++)
        ans += seqa[i] - seqb[i];
    printf("%d", ans);
    return 0;
}

变量名表

变量意义 变量名
答案 ans
st
队列 q
最大值 MAX_???
最小值 MIN_???
数组 arr[]
多个数组或数列 seq?[]
源数据/起点 src
目标数据/终点 dst
距离 dist

现在,我已进入半退役状态

背景 – 晃动人心的改革

官方文件:中华人民共和国教育部

在2019的头几天,这个文件就直接惊动了所有竞赛生和竞赛生的家长们。对于竞赛生而言,这个文件里面的几条是直接关系到升学这一大事的:

···二是严格制定录取标准,高校在现有基础上进一步降低给予自主招生考生的优惠分值。三是严格控制招生规模,高校在上一年录取人数基础上适度压缩招生名额。

半退役

我本人听到这个消息之后非常的崩溃。本来省内竞赛竞争加强,然后又出现了这样的文件,对于我这个蒟蒻而言,无疑就是在告诉我,除非进国家集训队,其他的奖拿到手之后都存在非常大的不稳定因素。而且,我短暂的竞赛经历不足以支撑我到达国集水平。如果一本约完全取消、最优惠分数线又高到了我高三无法弥补的地步的话,那么我只能面临退役。

而现在没有任何证据显示一本线取消或者是最优分数线会很高。然而,我这一届就非常之尴尬,万一到了我们最后一年的时候力度加大,我就很容易被卡死。这样来看,观望也非常的亏。

但是,我不想退役。即使高考会比竞赛容易很多(确实容易很多),但是我不想让我的竞赛生涯就停留在5个月的时间,也不想停留在省三这个垃圾奖项上。我想追求更高的目标,想认识更多的神仙,想学习更多的算法,当然也想考上更好的大学,在更好的计算机专业里学习。

我全家现在都在劝我退役,我妈甚至拿“你高考肯定更好”这样的屁话来劝退,我感到压力非常的大。我想追求我自己想要的,尽管全盘皆输。

在官方和家庭的压力之下,我只好进入半退役状态。

P1069:细胞分裂题解

思路转化

题目大意是这样的:给出数字\(N\),\(m_1\),\(m_2\),\(S_{i[1\dots N]}\),求最小的\(t\),使得某一\(S_i^t \; mod\; m_1^{m_2}\)。

所以之后就非常的显然了,我们只要分析出每一个数的质因数与\(m_1\)的质因数的关系即可。如果有一个数\(c\)的质因数集为\(A\),那么我们可以遍历\(m_1\)的质因数集,记录答案。如果质因数集不包含\(m_1\)的质因数集直接退出。

代码

// P1069.cpp
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define ll long long
using namespace std;
const int MX_N = 30020, INF = 0x3f3f3f3f;
ll n, m1, m2, arr[MX_N], pipePrime[MX_N], cellPrime[MX_N], lit, ans = INF;
int main()
{
    scanf("%lld%lld%lld", &n, &m1, &m2);
    for (int i = 1; i <= n; i++)
        scanf("%lld", &arr[i]);
    if (m1 == 1)
    {
        printf("0");
        return 0;
    }
    for (int i = 2; m1 != 1; i++)
    {
        while (!(m1 % i))
            m1 /= i, pipePrime[i] += m2;
        lit = max(lit, (ll)i);
    }
    for (int i = 1; i <= n; i++)
    {
        ll now = 0;
        for (int j = 2; j <= lit; j++)
            if (pipePrime[j] != 0)
            {
                ll tim = 0;
                while (!(arr[i] % j))
                    arr[i] /= j, tim++;
                if (!tim)
                {
                    now = INF;
                    break;
                }
                now = max(now, (pipePrime[j] - 1) / tim);
            }
        ans = min(ans, now);
    }
    if (ans != INF)
        printf("%lld", ans + 1);
    else
        printf("-1");
    return 0;
}