原题(?)视频链接:能看到这个视频真正结局的都是大神!
倒数第二题的队长数,大概就是包含 $\geq 233$ 的质因子的数,直接用埃氏筛筛了一下
时间复杂度 $O(nloglogn)$ 本地跑了 $1.5$ 秒
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 3e7;
int primes[N], cnt;
bool st[N];
bool dui[N];
vector<int> res;
void init(int n)
{
for(int i = 2; i <= n; i ++)
{
if(!st[i])
{
if(i >= 233) dui[i] = true;
for(int j = 2 * i; j <= n; j += i)
{
st[j] = true;
if(i >= 233) dui[j] = true;
}
}
}
res.push_back(0);
for(int i = 1; i <= n; i ++)
if(dui[i]) res.push_back(i);
}
int main()
{
init(N - 1);
printf("%d\n", res[666666]);
printf("%d\n", res[22332233]);
printf("%d\n", res[23333333]);
return 0;
}
最后一题博弈,写了个记忆化搜索
递归层数可能有点多,栈空间开了很大(1280M)才跑出来,本地跑了 $2.1$ 秒
之前读错题最优最劣完全写反了,修改之后应该是正解
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 5300000;
int f[4][N];
int w[6] = {1, 11, 114, 1145, 11451, 114514};
int mod(int x) // 对4取非负的模数
{
return (x % 4 + 4) % 4;
}
int sg(int u, int x) // 轮到第u个人,剩下x个石子时谁会获胜
{
if(~f[u][x]) return f[u][x];
for(int i = 0; i < 6; i ++)
if(x == w[i]) return f[u][x] = u;
int res = mod(u + 1);
for(int i = 0; i < 6; i ++)
{
if(w[i] > x) break;
int t = sg((u + 1) % 4, x - w[i]);
if(mod(u - t) < mod(u - res)) res = t;
}
return f[u][x] = res;
}
int main()
{
memset(f, -1, sizeof f);
printf("%d\n", sg(0, 4396));
printf("%d\n", sg(0, 233333));
printf("%d\n", sg(0, 5201314));
return 0;
}
当队长杯遇到滑稽大佬