首页 > 其他分享 >【2021.6.26 NOI模拟】Problem B. 简单题 another solution

【2021.6.26 NOI模拟】Problem B. 简单题 another solution

时间:2024-04-06 15:56:12浏览次数:23  
标签:26 NOI 2021.6 ll cnt 因子 移除 Copy 2i

Problem Description

image.png

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

image.png

首先,我们从小到大枚举 \(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);
}

标签:26,NOI,2021.6,ll,cnt,因子,移除,Copy,2i
From: https://www.cnblogs.com/znpdco/p/18117495

相关文章

  • LC 226.翻转二叉树
    226.翻转二叉树给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]提示:树中节点数目范围在[0,100]内......
  • X264码率控制二(vbv码率控制)
    一、VBV码率控制模型图        将vbvbuff比做水桶,编码后帧的bits比做水瓶的水;vbv的码率控制过程可以看做往水桶中加水以从水桶中用水的过程;vbv码率控制原理图如下:    上图中可用水量buffer_fill_final初始量为水桶总容量vbv_buffer_size;流入的流速固定为bi......
  • P1002 [NOIP2002 普及组] 过河卒
    题目链接:从起点走到终点,最后一步一定是向右或向下走过来的,因此就可以列出状态转移方程。值得注意的是,对于横着和竖着的两条边界不可直接想当然地认为路径数一定等于\(1\),因为在中途可能会有控制点的存在,因此还是要老老实实地列出状态转移方程。由于边界时只会从一个方向递推过来......
  • 26版SPSS操作教程(初级第十八~二十二章)
    前言#由于导师最近布置了学习SPSS这款软件的任务,因此想来平台和大家一起交流下学习经验,这期推送内容接上一次第十七章的学习笔记,希望能得到一些指正和帮助~粉丝及官方意见说明#针对官方爸爸的意见说的推送缺乏操作过程的数据案例文件澄清如下:1、操作演示的数据全部由我本人......
  • Unity类银河恶魔城学习记录12-4 p126 Item Tooltip源代码
    Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考此代码仅为较上一P有所改变的代码【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibiliUI.csusingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngin......
  • P9058 [Ynoi2004] rpmtdq 题解
    Description给定一棵有边权的无根树,需要回答一些询问。定义\(\texttt{dist(i,j)}\)代表树上点\(i\)和点\(j\)之间的距离。对于每一组询问,会给出\(l,r\),你需要输出\(\min(\texttt{dist(i,j)})\)其中\(l\leqi<j\leqr\)。\(n\leq2\times10^5\),\(q\leq10^6\),\(1\l......
  • 每日一题:1026. 节点与其祖先之间的最大差值
    给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V,其中 V=|A.val-B.val|,且 A 是 B 的祖先。(如果A的任何子节点之一为B,或者A的任何子节点是B的祖先,那么我们认为A是B的祖先) 示例1:输入:root=[8,3,10,1,6,null,14,null,null,4,......
  • P2285 [HNOI2004] 打鼹鼠
    题目:链接:https://www.luogu.com.cn/problem/P2285这题感觉如果想不到递推关系可能会很麻烦,因为我之前想到的关系就是用dp存:包含三个维度:times,x,y,即dp[times][x][y]来存,然后递推。但是如果把dp看作是以p结尾的抓到的耗子数量时就会方便很多同时要注意,每次到一个点的时候先立为1......
  • P3956 [NOIP2017 普及组] 棋盘
    原题链接题解dijkstra算法的应用。相同颜色权值为0;不同颜色权值为1;有颜色到无颜色权值为2。其中不能连续两步走无颜色结点,即该情况需要特别考虑。code #include<bits/stdc++.h>usingnamespacestd;constintMAX=1e9;inta[105][105],dis[105][105],vis[105][105];int......
  • 信息学奥赛一本通题目解析:1938:【07NOIP普及组】奖学金(排序)
    【题目描述】某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前55名学生发奖学金。期末,每个学生都有33门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学......