数论

Problem - B - Codeforces

题意

给定 \(n\;(1<=n<=3*10^5)\) 个数 \(a[i]\), \(1<=a[i]<=10^6\)

把 \(a[i]\) 看做是 n 个点的点权

如果 \(\frac {lcm(a[i],a[j])}{gcd(a[i],a[j])}\) 是完全平方数,则可以给 \(i\lrarr j\) 连一条无向边

每秒后都会令每个连通块中的每个点的点权变为整个连通块的点权乘积,有 \(q\;(1<=q<=3*10^5)\) 次询问,每次回答 \(w\) 秒后最大的连通块大小

思路

  1. \(\frac {lcm(a[i],a[j])}{gcd(a[i],a[j])}\) 是完全平方数 \(\Lrarr\) \(a[i]*a[j]\) 是完全平方数

  2. 设 \(a[i]=p_1^{s_1}*p_2^{s_2}*...p_n^{s_n}\), 我们不关心 \(s_i\) 具体是多少,只需要关心 \(s_i\) 的奇偶性,因此令 \(y=p_1^{s_1mod\;2}*p_2^{s_2mod 2}*...p_n^{s_nmod\;2}\)

  3. 初始时某个连通块有 3 种情况

    1. 每个点点权的 y 都为 1
    2. 每个点点权的 y 不为 1,连通块的大小是偶数
    3. 每个点点权的 y 不为 1,连通块的大小是奇数
  4. w = 0 时,求连通块大小的最大值即可;

    w >= 1 时,第 2 种连通块会转换为 1,第 3 种永远是第 3 种,因此把 2 转换成 1,再求 max(第 1 种的大小,第 3 种的大小的最大值)

  5. 实际上不需要建边跑并查集,复杂度太高;

    用 y 来表示即可,枚举 \(a[i]\), 分解 \(a[i]\) 求出对应的 y,\(mp[y]++\);

    \(mp[1]\) 就是第一种连通块的大小;其余的 y 也可用 \(mp[y]\mod2\) 来判断其大小的奇偶性,详细见代码

  6. 第 2 步的分解有两种方法:

    1. 线性筛 \(\sqrt{max(a[i])}\) 内的素数,用素数来分解,复杂度为线性筛的 \(O(1000)\), 分解单个数的 \(O(\frac {\sqrt {a[i]}}{\ln{\sqrt{a[i]}}})\)
    2. 线性筛 \(max(a[i])\) 内的素数,并在线性筛中预处理除 \(p[i]\) 表示 \(i\) 的最小质因子为 \(p[i]\);分解时每次就可以精准找到下一个要除的素数,复杂度为 线性筛的 \(O(10^6)\), 分解单个数的 \(O(\log {a[i]})\)

    当值域较小且要分解的数较多时用第 2 种更好

代码

#include <bits/stdc++.h>
using namespace std;
#define endl "\n" typedef long long ll;
typedef pair<int, int> PII; const int N = 3e5 + 10, M = 1e6 + 10;
int n;
int a[N];
int pr[M / 5], p[M], cnt;
void get_primes(int n)
{
p[1] = 1;
for (int i = 2; i <= n; i++)
{
if (!p[i])
{
pr[++cnt] = i;
p[i] = i;
} for (int j = 1; j <= cnt && pr[j] <= n / i; j++)
{
p[i * pr[j]] = pr[j];
if (p[i] == pr[j])
break;
}
}
}
map<int, int> mp;
void fenjie(int x)
{
int y = 1;
while(x > 1)
{
int k = 0;
int minp = p[x];
while(x % minp == 0)
{
k++;
x /= minp;
}
if (k & 1)
y *= minp;
}
mp[y]++;
}
int main()
{
int T;
scanf("%d", &T);
get_primes(M - 10);
while(T--)
{
scanf("%d", &n);
mp.clear();
for (int i = 1; i <= n; i++)
{
int x;
scanf("%d", &x);
fenjie(x);
}
int ans0 = 0;
//w = 0
for (auto &[y, t] : mp)
ans0 = max(ans0, t);
//w >= 1
int ans1 = 0;
for (auto &[y, t] : mp)
{
//把第 2 种变成第 1 种
if (y != 1 && t % 2 == 0)
{
mp[1] += t;
mp[y] = 0;
}
}
for (auto &[y, t] : mp)
ans1 = max(ans1, t);
int q;
scanf("%d", &q);
while(q--)
{
int w;
scanf("%d", &w);
if (w >= 1)
printf("%d\n", ans1);
else
printf("%d\n", ans0);
}
}
return 0;
}

Codeforces Round #694 (Div. 1) - B. Strange Definition的更多相关文章

  1. Codeforces Round #425 (Div. 2) C - Strange Radiation

    地址:http://codeforces.com/contest/832/problem/C 题目: C. Strange Radiation time limit per test 3 second ...

  2. Codeforces Round #694 (Div. 2)

     A. Strange Partition 题意:就是求最小和最大的bi/x向上取整的和. 思路:见题解:https://blog.csdn.net/qq_45900709/article/detai ...

  3. Codeforces Round #697 (Div. 3) G. Strange Beauty (DP,数学)

    题意:给你一组数,问你最少删去多少数,使得剩下的数,每个数都能整除数组中其它某个数或被数组中其它某个数整除. 题解:我们直接枚举所有因子,\(dp[i]\)表示\(i\)在数组中所含的最大因子数(当我 ...

  4. Codeforces Round #373 (Div. 1)

    Codeforces Round #373 (Div. 1) A. Efim and Strange Grade 题意 给一个长为\(n(n \le 2 \times 10^5)\)的小数,每次可以选 ...

  5. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  6. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  7. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  8. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  9. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  10. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

随机推荐

  1. springboot mybatisPlus集成shiro实现权限控制

    创建数据库表.由于时间仓促,数据库表设计不太合理,后期会更改 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ------------------- ...

  2. vscode自定义工作目录

    vscode作为目前最受欢迎的编辑器,一直用vscode,但是最近清理c盘,发现vscode的目录,插件和数据目录,占据了上G的空间,那么,如何自定义 vscode的工作目录和数据目录呢,这里参考了一 ...

  3. webpack5基础用法2

    webpack的基础用法2 webpack的优化方向 提升开发体验 提升打包构建速度 减少代码体积 优化代码运行性能 SourceMap 生成一个.map文件,形成一个映射, 可以通过错误找到源文件 ...

  4. echarts饼图同时展示数量和百分比

    要在ECharts中同时展示饼图数据的数量和百分比,可以使用ECharts中的formatter功能.下面是一个简单的示例,演示如何在饼图中显示数量和百分比: option = { tooltip: ...

  5. 关于easyocr、paddleocr、cnocr之比较

    关于easyocr.paddleocr.cnocr之比较 EasyOCR 是一个使用 Java 语言实现的 OCR 识别引擎(基于Tesseract).借助几个简单的API,即能使用Java语言完成图 ...

  6. 「SOL」Permanent (Codeforces)

    这道题第一个结论都不知道怎么拿部分分啊 题意 一个 \(n\times n\) 的方阵 \(M\),上面除了 \(k\) 个特殊位置,其他位置都是 \(1\).第 \(i\) 个特殊位置在 \((x_ ...

  7. 基于DFA算法实现的敏感词过滤

    本文转自浅析敏感词过滤算法(C++),自己也在其基础上根据自己的情况做了一点修改. https://blog.csdn.net/u012755940/article/details/51689401? ...

  8. 2.5 OpenEuler 中C与汇编的混合编程

    2.5 OpenEuler 中C与汇编的混合编程 任务详情 在X86_64架构下实践2.5中的内容,提交代码和实践截图 把2.5的内容在OpenEuler中重新实践一遍,提交相关代码和截图 任务一x8 ...

  9. 性能测试-性能分析思路以及CPU

    1.性能分析思路 性能测试分析的思路:先分析硬件 .网络. 系统配置.应用程序 硬件: cpu.内存.磁盘.网络.io 4.常见问题处理4.1 常见问题及解决方法如果r经常大于4,且id经常少于40, ...

  10. Java枚举类的学习

    package java1; /** * @author 高槐玉 * #Description: * 枚举类的使用 * 1,枚举类的理解:类的对象只有有限个,确定的.我们称此类为枚举类 * 2.当需要 ...