牛客 2020.10.20 TG 前两题
T1 GCD
数学水题。。。
对于每个数,如果这个数有两个及以上的质因数的话,它所有除 \(1\) 之外的因数求 \(GCD\) 的值一定为 \(1\)。那么判断是否是质数或质数的次方即可(质数除 \(1\) 之外的因数只有它本身,而质数的次方除 \(1\) 之外的质因数只有一个,故不存在两个及以上的质因数。
再来考虑特殊的是质数的次方 \(x^n\) 的情况,它除 \(1\) 之外的因数一定只有 \(x\),所以得出这个质数并累加答案即可。那就跑欧拉筛的时候边跑边暴力更新呗。
#include <cstdio>
#include <cmath>
const int MAXN = 1e7 + 5;
int num[MAXN], len = 0;
bool flag[MAXN];
int vis[MAXN];
typedef long long LL;
void euler(int n) { // 欧拉筛
for(int i = 2; i <= n; i++) {
if(!flag[i]) {
num[++len] = i;
int t = 1;
while((LL)t * i <= n) { // 暴力枚举次方
t *= i;
vis[t] = i; // 记录这个次方对应的质数
flag[t] = true;
}
}
for(int j = 1; j <= len; j++) {
if(i * num[j] > n)
break;
flag[i * num[j]] = true;
if(i % num[j] == 0)
break;
}
}
return ;
}
int main() {
int m, n;
scanf ("%d %d", &m, &n);
euler(n);
LL ans = 0;
flag[1] = true;
for(int i = m; i <= n; i++) {
if(i == 1) // 排除1的情况
continue;
if(!flag[i]) // 是质数
ans += i; // (所有除1之外的因数的GCD即是本身
else if(vis[i]) // 如果是质数的某个次方
ans += vis[i]; // 加上那个对应的质数
else // 否则这个数有两个及以上的质因子,加一即可
ans++;
}
printf("%lld\n", ans);
return 0;
}
T2 包含
显然如果用n方的算法会卡到飞起。。。(右边巨佬考场 DFS 记忆化过掉了呢
考虑优化。我们在每一次输入的时候更新一下有哪些数 \(\&\) 上这个数等于内个数本身。记这个集合内的数为 \(Q\),即是寻找有哪些 \(X\) 满足 \(Q \& X = X\)。
对于一个 \(Q \& X = X\),在二进制数位中 \(X\) 等于 \(1\) 的位,对应的 \(Q\) 中的位一定等于 \(1\),但因为 \(Q\) 是确定的,所以我们考虑依次替换掉 \(Q\) 二进制当中等于 \(1\) 的位,将其改为 \(0\),枚举所有情况即是找到了所有的 \(X\)。
至于如何枚举 \(Q\) 中为 \(1\) 的位……芜湖起飞。
int t = x;
while(t) {
vis[t] = true;
t = (t - 1) & x;
}
就是上述代码,最好在草稿纸上手推一下,不然很难理解。
为此我还和JC讨论了好久。
结论:上述代码按以下顺序枚举为 \(1\) 的位改其为 \(0\)。
Q: 1 0 0 0 1 0 0 1
1. ^
2. ^
3. ^ ^
4. ^
5. ^ ^
6. ^ ^
7. ^ ^ ^
#include <cstdio>
const int MAXN = 1000005;
bool vis[MAXN];
int main() {
int n, m;
scanf ("%d %d", &n, &m);
for(int i = 1; i <= n; i++) {
int x;
scanf ("%d", &x);
if(vis[x])
continue;
int t = x;
while(t) {
vis[t] = true;
t = (t - 1) & x;
}
}
while(m--) {
int x;
scanf ("%d", &x);
if(vis[x])
printf("yes\n");
else
printf("no\n");
}
return 0;
}
牛客 2020.10.20 TG 前两题的更多相关文章
- 2020牛客多校第八场K题
__int128(例题:2020牛客多校第八场K题) 题意: 有n道菜,第i道菜的利润为\(a_i\),且有\(b_i\)盘.你要按照下列要求给顾客上菜. 1.每位顾客至少有一道菜 2.给顾客上菜时, ...
- 牛客网数据库SQL实战解析(51-61题)
牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...
- 牛客网数据库SQL实战解析(41-50题)
牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...
- 2019牛客多校第八场 F题 Flowers 计算几何+线段树
2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...
- 牛客网数据库SQL实战解析(31-40题)
牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...
- 牛客网数据库SQL实战解析(21-30题)
牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...
- 牛客网数据库SQL实战解析(11-20题)
牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...
- 牛客网数据库SQL实战解析(1-10题)
牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
随机推荐
- Java动态代理——框架中的应用场景和基本原理
前言 之前已经用了5篇文章完整解释了java动态代理的原理,本文将会为这个系列补上最后一块拼图,展示java动态代理的使用方式和应用场景 主要分为以下4个部分 1.为什么要使用java动态代理 2.如 ...
- Object of type Decimal is not JSON serializable
json遇到Decimal 型数据无法正确处理 解决方案 import json result = [ {'name': '小红', 'age': 26, 'balance': decimal.Dec ...
- 833. Find And Replace in String —— weekly contest 84
Find And Replace in String To some string S, we will perform some replacement operations that replac ...
- 关于synchronized无法锁住Integer原因
原因 在多线程的时候,为了保证数据安全,必须在修改数据时使用线程同步,java中的synchronized用来实现线程同步.线程列队. 学完多线程基础的我,写一个多线程交替输出1,2,3,4,5... ...
- 「BalticOI 2020」病毒
AC自动机+DP最短路转移 怎么说呢,挺套路的,也不是太难,但是一上手会被大量的信息淹没思路,还是要注意关注主要信息,不要被一些细节卡住 由于抗体是要在基因序里面出现过,那么考虑把抗体的序列检出AC自 ...
- 看得见的成本!1款工具实现K8S资源成本监控可视化
本文来自Rancher Labs 关注我们,第一时间获取技术干货 计算Kubernetes成本的复杂性 采用Kubernetes和基于服务的架构可以为企业带来诸多好处,如团队可以更快地迁移以及应用程序 ...
- 记载idea创建spring-boot项目时“Spring Initalizr Error”的问题处理
- 家庭版window10找不到文件'gpedit.msc'。请确定文件名是否正确后 ,再试一次
今天遇到电脑找不到gpedit.msc文件,所以记录一下这个问题的解决方法 1. 首先建立一个空白文档 代码如下: @echo off pushd "%~dp0" dir /b ...
- C++ Split string into vector<string> by space(转)
c++中没有这么方便的实现,但也有很多的方法能实现这个功能,下面列出五种常用的实现的方法,请根据需要选择,个人觉得前三种使用起来比较方便,参见代码如下: #include <vector> ...
- 分布式监控系统之Zabbix基础
1.为什么要使用监控系统? 我们知道一个系统不管怎么讲它都会出故障,我们为了保证线上业务的最大化的可用性,通常我们要给关键业务做高可用:做高可用的目的是为了让故障发生时,能够有一个备用的解决方案,将故 ...