【2021.6.26 NOI模拟】Problem B. 简单题 another solution
Problem Description
Input
从文件
b.in中读入数据。一个正整数 n。
Output
输出到文件
b.out中。一个整数表示答案。
Sample Data
Input #1 Copy
5
Output #1 Copy
31
Input #2 Copy
50
Output #2 Copy
2885
Data Constraint
首先,我们从小到大枚举 \(n\),假设当前枚举到 \(i\),\(S\) 会多出两个数 \(2i-1\) 和 \(2i\)。因为要插入其中一个到 \(A\) 中,还要使得和尽量小,所以我们选择向 \(A\) 插入 \(2i-1\)。
此时,\(A\) 中可能会出现 \(2i-1\) 的因子(不是质因子),那么我们就枚举出这些因子并把它们从 \(A\) 中移除。
假设我们移除了 \(x\) 个因子,那么 \(A\) 的大小就会减少 \(x\)。所以我们还要再插入 \(x\) 个数。这些数就选作刚刚我们移除的数的倍数。
因为 \(A\) 中不会同时出现倍数,所以我们插入每个被移除数最小的倍数——它们的 \(2\) 倍。
插入了部分数后,我们同样也要担心这些数是否在 \(A\) 中有因子,所以我们重复上面的操作:找因子,从 \(A\) 中移除,将这些移除的数的 \(2\) 倍加入 \(A\) 中。具体 dfs 就可以。因为每个数都只会进行一次这个操作,所以时间复杂度是 \(O(n\times 找因子时间)\) 的。实现较差可以做到 \(O(n\sqrt{n})\),但如果你的实现比较好,比如枚举每个数的倍数加入,可以做到 \(O(n\ln n)\) 的。这个做法不知道比正解差多少倍,但是想起来简单,没有弯路。但是需要注意常数。比如用链式前向星代替 vector。
#include <cstdio>
#include <vector>
using namespace std;
#define ll long long
#define N 1000010
ll n, ans, a[N];
ll head[N], nxt[13470035], to[13470035], cnt;
void addEdge(ll u, ll v) {
cnt ++;
to[cnt] = v;
nxt[cnt] = head[u];
head[u] = cnt;
}
void init() {
for(ll i = 1; i <= n; i ++) {
addEdge(i, 1);
for(ll j = 2; i * j <= 2 * n; j ++) {
addEdge(i * j, i);
}
}
}
void dfs(ll x) {
for(ll j = head[x]; j; j = nxt[j]) {
ll i = to[j];
if(a[i]) { // 有因数,除掉
a[i] = 0;
ans -= i;
a[i * 2] = 1;
ans += i * 2;
dfs(i * 2);
}
}
}
int main() {
freopen("b.in", "r", stdin);
freopen("b.out", "w", stdout);
scanf("%lld", &n);
init();
a[1] = 1;
ans = 1;
for(ll i = 2; i <= n; i ++) {
ans += 2 * i - 1; // 必须加入
a[2 * i - 1] = 1;
dfs(2 * i - 1);
// printf("%lld %lld\n", i, ans);
}
printf("%lld", ans);
}
【2021.6.26 NOI模拟】Problem B. 简单题 another solution的更多相关文章
- 5.26 NOI 模拟
\(T1\)石子与HH与HHの取 博弈是不可能会的 \(c_i\)相等,比较显然的\(Nim,\)直接前缀异或求一下 \(a_i=1,\)区间长度对\(2\)取模 结论\(:\)黑色石子严格大于白色个 ...
- poj1298 The Hardest Problem Ever 简单题
链接:http://poj.org/problem?id=1298&lang=default&change=true 简单的入门题目也有这么强悍的技巧啊!! 书上面的代码: 很厉害有没 ...
- HDU 4627 The Unsolvable Problem(简单题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4627 题目大意:给定一个整数n(2 <= n <= 109),满足a+b=n并且[a,b] ...
- 5.23 NOI 模拟
$5.23\ NOI $模拟 \(T1\)简单的计算几何题 \(zjr:\)我当时没改,那么自己看题解吧 倒是有个简单的随机化方法(能获得\(72pts,\)正确性未知)\(:\) 随机两条切椭圆的平 ...
- 5.6 NOI模拟
\(5.6\ NOI\)模拟 明天就母亲节了,给家里打了个电话(\(lj\ hsez\)断我电话的电,在宿舍打不了,只能用教练手机打了) 其实我不是很能看到自己的\(future,\)甚至看不到高三的 ...
- HDU 1753 大明A+B(字符串模拟,简单题)
简单题,但要考虑一些细节: 前导0不要,后导0不要,小数长度不一样时,有进位时,逆置处理输出 然后处理起来就比较麻烦了. 题目链接 我的代码纯模拟,把小数点前后分开来处理,写的很繁杂,纯当纪念——可怜 ...
- 自己模拟的一个简单的web服务器
首先我为大家推荐一本书:How Tomcat Works.这本书讲的很详细的,虽然实际开发中我们并不会自己去写一个tomcat,但是对于了解Tomcat是如何工作的还是很有必要的. Servlet容器 ...
- Linux——模拟实现一个简单的shell(带重定向)
进程的相关知识是操作系统一个重要的模块.在理解进程概念同时,还需了解如何控制进程.对于进程控制,通常分成1.进程创建 (fork函数) 2.进程等待(wait系列) 3.进程替换(exec系列) 4 ...
- python练习笔记——编写一个装饰器,模拟登录的简单验证
编写一个装饰器,模拟登录的简单验证(至验证用户名和密码是否正确) 如果用户名为 root 密码为 123则正确,否则不正确.如果验证不通过则不执行被修饰函数 #编写一个装饰器,模拟登录的简单验证 #只 ...
- Problem 2125 简单的等式(FZU),,数学题。。。
Problem 2125 简单的等式 Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description 现在有一个等式如下:x^2+ ...
随机推荐
- moviepy 官方网址
https://zulko.github.io/moviepy/ Gitee 说我有违规信息 醉了 { title: "moviepy", url: "https://z ...
- vue3 markdown 读取文件的两种方法 有gitee发布地址
方法一: markdown-loader html-loader import的时候就转换成html了,每次需要build,但是可以本地双击就能看,放哪个目录页不限制 方法二: axios + mar ...
- gdb调试入门指北
GDB安装及其插件控制 下载 GDB ,这个项目将 GDB 的插件放到了一个文件夹下,方便读取文件路径 $ git clone https://gitee.com/hongsofwing/GDB-Pl ...
- arch签名出现问题时,无法修复时
sudo rm -rf /etc/pacman.d/gnupgsudo pacman-key --init sudo pacman-key --populate archlinux && ...
- manjaro安装/卸载gnome/kde桌面环境
安装gnome桌面环境 步骤 1. 在运行以下教程之前,请确保我们的系统是最新的: sudo pacman -Syu 步骤 2. 在 Manjaro 20 上安装 GNOME 桌面. 现在我们通过执行 ...
- day01-2-@RequestMapping和Rest
@RequestMapping和Rest 1.@RequestMapping 1.1基本使用 @RequestMapping注解可以指定 控制器(处理器) 的某个方法的请求url 1.2@Reques ...
- AOSP-刷机
准备 1.AOSP源码下载 可以参考AOSP下载且编译 这里我下载的是android-12.1.0_r5的AOSP源码 2.下载驱动 因为我下载的是android-12.1.0_r5的AOSP源码,因 ...
- 8、Linux CentOS 安装.Net Core 3.1
1.添加密钥 将 Microsoft 包签名密钥添加到受信任密钥列表,并添加 Microsoft 包存储库. 打开终端并运行以下命令: sudo rpm -Uvh https://packages.m ...
- 小米Linux 运维工程师面试真题
小米Linux 运维工程师面试真题 首先我们来看下小米 Linux 运维工程师招聘岗位要求: [岗位定义]运维工程师 [岗位薪资]10K-24K [基本要求]北京 / 经验 3-5 年 / 本科及以上 ...
- vue3中使用simple-keyboard实现虚拟键盘(带中文切换数字键盘)
效果图 官网 simple-keyboard官网:https://hodgef.com/simple-keyboard/ 打不开的话请用魔法 不足 中文语言包支持度不够.不过自己可以找语言包替换 依赖 ...

