10-30 NOIP模拟赛

今天分数还看的过去,只是第二题没有正解,第三题没有35我表示很伤心。必须继续努力,保持内心纯净,心无杂念,知行合一,摒除恶念。

100 + 80 + 5 = 185 芜湖!

T1 新的阶乘(factorial)

题目描述

我们定义 \(f(x)=x^1×(x−1)^2×(x−2)^3…2^{x−1}×1^x\),请求出 \(f(n)\) 的质因子分解形式。

输入数据 1

5

输出数据 1

f(5)=2^8*3^3*5

首先观察数据范围 \(2≤n≤10^7\),首先就想到 \(O(n)\) 的做法,这道题唯一需要我们做的就是把合数分解成其的质因数,我们考虑遇到一个合数怎么办,如果把它分解成质因数肯定是不怎么优的,实际上这么做也确实只有30分,只能过 \(10^5\)。

其实接下来就很轻松想到,其实只要把每个数分解成两个数相乘即可,这样从大枚举到小,就能把所有的数全部都给分解掉。怎么把每个数拆成两个数呢,试除肯定是不现实的,质数需要枚举的 \(\sqrt n\),就用线性筛即可,不是质数的数,开一个数组记录其最小质因子。

代码也很好懂的啦!

#include<bits/stdc++.h>
using namespace std;
#define N 12000010
int prime[N],cnt=0;
int n,sp[N];
long long m[N];
bool isp[N]; void primes(int x){
memset(isp,1,sizeof(isp));
for(int i=2;i<=x;i++){
if(isp[i]) prime[++cnt]=i;
for(int j=1;j<=cnt;j++){
if(i*prime[j]>x) break;
isp[i*prime[j]]=0;sp[i*prime[j]]=prime[j];
if(i%prime[j]==0) break;
}
}
} int main(){
freopen("factorial.in","r",stdin);
freopen("factorial.out","w",stdout);
scanf("%d",&n);
primes(n);
for(int i=n;i>=2;i--){
long long num=n-i+1;
if(isp[i]) m[i]+=num;
else{
m[sp[i]]+=num+m[i];
m[i/sp[i]]+=num+m[i];
m[i]=0;
}
}
printf("f(%d)=",n);
int s=2;
while(!m[s]) s++;
printf("%d",s);
if(m[s]>1) printf("^%lld",m[s]);
for(int i=s+1;i<=n;i++){
if(m[i]){
printf("*%d",i);
if(m[i]>1) printf("^%lld",m[i]);
}
}
return 0;
}

T2 博弈树(tree)

题目描述

Alice 和 Bob 又开始玩游戏了, 他们已经把石子堆得比山还高了, 现在他们要玩一种更新奇的游戏,这种游戏的规则如下:

  • 给定一颗 \(n\) 个节点的树,Alice 和 Bob 随机选择一个节点作为起点放上棋子,由 Alice 先手。
  • 轮到一方后可以将这颗棋子移动到树上任意一点,每次一方移动的距离必须比对方上一次移动的距离还要大,开始时默认为 0 。
  • 当一方不能再次移动之后判负。

现在 Alice 和 Bob 已经找到了一棵节点编号为 \(1∼n\) 的树准备开始游戏,作为博亦高手,Alice 和 Bob 均会做出最优的选择,选择一个节点后,他们知道游戏必然有一种必胜策略,现在他们想知道游戏的胜负,他们会询问你 \(q\) 次,每次他们会选择一个节点询问,你只需要回答在最优策略下以这个为节点为起点的胜者是谁即可。

输入数据 1

6 3
1 2
2 3
2 4
1 5
4 6
2
3
1

输出数据 1

Bob
Alice
Alice

这是很少遇到的比较有意思的 T2,只不过呢,就是正解有点太简单了。

你告诉我直接输出 Alice 有70分?????(好歹来个捆绑啊

先讲暴力 80 分做法:

受到昨天坐的 NOIP2021 T2 的暴力启发,我打了一个记忆化爆搜,即 \(f_{i,j}\) 表示当前在编号为 \(i\) 的节点上,上一步走的距离为 \(j\),然后每次询问暴力枚举当前点能走到的所有点,如果有一个点必输,那么当前点必赢,如果全部都必赢,那么当前点必败。

80 分代码:

#include<bits/stdc++.h>
using namespace std;
#define N 300005
int fir[N],nex[N],to[N],tot=0;
int n,q;
int f[5010][5010];
int dep[5010][5010]; void add(int x,int y){
nex[++tot]=fir[x];
fir[x]=tot;
to[tot]=y;
} void find(int x,int u,int fa){
dep[x][u]=dep[x][fa]+1;
for(int e=fir[u];e;e=nex[e]){
int v=to[e];
if(v==fa) continue;
find(x,v,u);
}
} int dfs(int u,int x){
if(f[u][x]) return f[u][x];
if(dep[u][u]!=-520){
dep[u][u]=-520;
dep[u][0]=-1;
find(u,u,0);
}
for(int i=1;i<=n;i++){
if(i==u) continue;
if(dep[u][i]>x){
if(dfs(i,dep[u][i])==2)
return f[u][x]=1;
}
}
return f[u][x]=2;
} int main(){
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
scanf("%d%d",&n,&q);
for(int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
for(int i=1;i<=q;i++){
int u;
scanf("%d",&u);
if(!f[u][0]) dfs(u,0);
if(f[u][0]==2){
printf("Bob\n");
}
else{
printf("Alice\n");
}
}
return 0;
}

然后来思考正解:

我们考虑先手的位置如果在直径端点的话一定是先手必胜的,否则先手一定不能将点移动到直径端点,于是我们考虑删除了原树所有直径端点的树,如果初始点在这棵树上为直径端点那么也一定是先手必胜的,因为先手可以将点移动到另一个直径端点,这样后手就一定会将点移动到原树的直径端点上,并且移动的长度一定小于原树直径,这样先手就可以将点移动到原树的另一个直径端点取得胜利。

所以这样我们可以将树的叶子一层一层的删下去,如果最后删剩下一个点那么在这个点是后手必胜的(因为先手无论如何都会将这个点移动到某一层的直径端点),否则根据我们之前的证明先手一定可以通过不断将点移动到下一层的直径端点取得胜利。

直接实现是 \(O(n^2)\) 的,不过我们注意到原树的直径中点一定是删一层后树的直径中点,于是直接判断原树直径长度即可。

AC 代码:

#include <bits/stdc++.h>
using namespace std;
#define N 100010
int n,q;
vector<int>e[N];
int fa[N];
int p=1,dep[N],st,ed;
int bs;
void dfs(int u, int f){
dep[u]=dep[f]+1;
fa[u]=f;
if (dep[u]>dep[p]) p=u;
for (auto v:e[u]) {
if (v==f) continue;
dfs(v,u);
}
}
int main() {
freopen("tree.in", "r", stdin);
freopen("tree.out", "w", stdout);
scanf("%d%d",&n,&q);
for (int i=1,u,v;i<n;++i) {
scanf("%d%d",&u,&v);
e[u].emplace_back(v);
e[v].emplace_back(u);
}
dfs(1, 0);st=p;
dfs(p, 0);ed=p;
if(dep[ed] & 1){
bs=ed;
for (int i=0;i<dep[ed]/2;++i) bs=fa[bs];
}
for(int i=1,u;i<=q;++i) {
scanf("%d",&u);
puts(u == bs ? "Bob" : "Alice");
}
return 0;
}

T3 划分(divide)

题目描述

对于一个长度为 \(n\) 的 01 字符串 \(S\),请你求出将其分为至少 \(k\) 段,将每一段看为二进制数求和后的最大值以及取到这个最大值的划分方案的数量。

输入格式

输入的第一行包含两个正整数 \(n, k\),保证 \(n \leq 2 \times 10^{6}\);\(1 \leq k \leq n\) 。

输入的第二行包含一个长度为 \(n\) 的字符串 \(S\),保证 \(S\) 只包含字符 \(0,1\) 。

输出格式

输出一行两个整数,分别表示最大的和 \(\bmod \ 998244353\) 的值以及此时划分的方案数 \(\bmod\ 998244353\) 的值。

10-30 NOIP模拟赛的更多相关文章

  1. 2016.10.30 NOIP模拟赛 day2 PM 整理

    满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...

  2. 2016.10.30 NOIP模拟赛 day2 AM 整理

    题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...

  3. 2018.10.30 NOIp模拟赛T2 数字对

    [题目描述] 小 H 是个善于思考的学生,现在她又在思考一个有关序列的问题.        她的面前浮现出一个长度为 n 的序列{ai},她想找出一段区间[L, R](1 <= L <= ...

  4. 2018.10.30 NOIp模拟赛 T1 改造二叉树

    [题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论 ...

  5. 10.16 NOIP模拟赛

    目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...

  6. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  7. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

  8. 2018.10.16 NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...

  9. 2017 10.25 NOIP模拟赛

    期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w    O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...

  10. 2018.10.03 NOIP+ 模拟赛 解题报告

    得分: \(30+5+0=35\)(考得真不咋滴) \(T1\):奥义商店(点此看题面) 以为很简单,对着这题想了一个多小时,最后果断打了个暴力交了... ... 看完题解发现其实也不是很难. 对于\ ...

随机推荐

  1. Odoo 美化登录界面

    实践环境 Odoo 14.0-20221212 (Community Edition) Odoo Web Login Screen 14.0 https://apps.odoo.com/apps/mo ...

  2. 题解:CF1957A Stickogon

    CF1957A Stickogon 题意 题意十分简单,给予你 \(n\) 个棍子,问这些棍子可以构成多少个正多边形. 思路 说是可以构成多少个正多边形,所以我们可以用边最少的正多边形等边三角形来计数 ...

  3. java web 开发框架编

    学习web 框架上开发需要的是安装  mysql 8.0  idea 2022 git  2.2.23  node 16以上 (新版本不好拉有些库了)jdk 最好是17以上 jdk8也是行的,反正不管 ...

  4. RBAC权限模型概述

    RBAC即role-based access control,基于角色的访问控制 通过角色来管理用户对系统资源的访问权限.RBAC是一种权限管理模型,核心思想是分离用户与具体权限,通过角色作为中介来实 ...

  5. NameCheap域名怎么样,如何注册购买域名?如何解析域名?

    Namecheap介绍 Namecheap是一家国外域名注册商和网站托管公司,成立于2000年,提供域名注册.虚拟主机.电子邮件托管.SSL证书.免费的WHOIS保护.CDN.VPS主机和独立服务器. ...

  6. 我用Awesome-Graphs看论文:解读PowerGraph

    PowerGraph论文:<PowerGraph: Distributed Graph-Parallel Computation on Natural Graphs> 上次通过文章< ...

  7. Hessian Free Optimization——外国网友分享的“共轭梯度”的推导

    外国网友分享的"共轭梯度"的推导: https://andrew.gibiansky.com/blog/machine-learning/hessian-free-optimiza ...

  8. Camera | 11.瑞芯微摄像头采集图像颜色偏绿解决笔记

    前言 在实际调试基于瑞芯微平台的camera过程中,发现显示的图片发绿, 现在把调试步骤分享给大家: 1.修改iq文件 sdk中位置: @external/camera_engine_rkaiq/iq ...

  9. Antd-React-TreeSelect前端搜索过滤

    在开发过程中,但是antd中的搜索会把多余的也会带出来 就例如下图,我们本想去搜索1但是他会把其子节点都带出来,其实我们的本意是像搜2一样或者当中间隔层处理 但是我们该如何解决这样的问题呢如何做到下面 ...

  10. Ubuntu APT sources.list 文件格式解释

    单行风格(传统) 传统的 sourses.list 文件使用单行风格配置,下面是两条单行风格的配置项: deb http://archive.ubuntu.com/ubuntu jammy main ...