\(>Codeforces\space980 D. Perfect Groups<\)

题目大意 : 设 \(F(S)\) 表示在集合\(S\)中把元素划分成若干组,使得每组内元素两两相乘的结果的都是完全平方数的最小组数

对于长度为\(n\)的序列 \(A\) ,对于每一个 \(k \, (1 \leq k \leq n)\) ,分别求出在\(A\)的所有子串中有多少 \([l, r]\) 满足 \(F(A[l, r]) = k\)

$n \leq 5000, \space |A_{i}| \leq 10^9 $

解题思路 :

先考虑如何求出 \(F(S)\) ,发现对于一个满足要求的组,对组内元素分解质因数后,每一个质因子出现次数的奇偶性相同

证明: 如果两数相乘是平方数,设这个数为 \(p_{1}^{k1} \times p_{2}^{k2} \times..\times p_{n} ^{kn} (p \ is \ prime)\),必然对于所有 \(k\) ,满足\(k \equiv 0 \pmod {2}\)

又因为当且仅当奇偶性相同的两个数相加才能变成偶数,所以对于组内的每一个数分解质因数后质因子出现次数的奇偶性相同

观察发现,出现次数为偶数的质因子出现与否并不影响答案,所以可以直接消去,对于所有出现次数为奇数的质因子,也只需要保留一个即可,这样做等价于将数中的所有平方因子全部消去

将问题回到序列上,发现消去平方因子后如果两个数 \(a,b\) 能分到一组,当且仅当 \(a = b\) ,问题就转变为区间不同的数的个数,直接暴力统计即可,注意特判 \(0\) 可以放到任意组。

/*program by mangoyang*/
#include<bits/stdc++.h>
#define inf (0x7f7f7f7f)
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
typedef long long ll;
using namespace std;
template <class T>
inline void read(T &x){
int f = 0, ch = 0; x = 0;
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
if(f) x = -x;
}
#define N (100005)
#define int ll
struct Point{ int x, id; } e[N];
int a[N], buf[N], Ans[N], n, col, f0;
inline bool cmp(Point A, Point B){ return A.x < B.x; }
inline int change(int x){
int res = x;
for(int i = 2; i * i <= abs(x); i++)
while(res % (i * i) == 0) res /= i * i;
return res;
}
main(){
read(n);
for(int i = 1; i <= n; i++) read(a[i]), a[i] = change(a[i]);
for(int i = 1; i <= n; i++) e[i].x = a[i], e[i].id = i;
sort(e + 1, e + n + 1, cmp);
a[e[1].id] = ++col; if(e[1].x == 0) f0 = 1;
for(int i = 2; i <= n; a[e[i++].id] = col){
if(e[i].x > e[i-1].x) col++;
if(e[i].x == 0) f0 = col;
}
for(int i = 1; i <= n; i++){
int res = 0;
for(int j = i; j <= n; j++){
if(!buf[a[j]] && a[j] != f0) res++;
buf[a[j]]++;
if(!res) Ans[1]++; else Ans[res]++;
}
for(int j = i; j <= n; j++) buf[a[j]]--;
}
for(int i = 1; i <= n; i++) cout << Ans[i] << " ";
return 0;
}

Codeforces 980 D. Perfect Groups的更多相关文章

  1. [codeforces 317]A. Perfect Pair

    [codeforces 317]A. Perfect Pair 试题描述 Let us call a pair of integer numbers m-perfect, if at least on ...

  2. CF 980D Perfect Groups(数论)

    CF 980D Perfect Groups(数论) 一个数组a的子序列划分仅当这样是合法的:每个划分中的任意两个数乘积是完全平方数.定义a的权值为a的最小子序列划分个数.现在给出一个数组b,问权值为 ...

  3. Codeforces 980D Perfect Groups 计数

    原文链接https://www.cnblogs.com/zhouzhendong/p/9074164.html 题目传送门 - Codeforces 980D 题意 $\rm Codeforces$ ...

  4. codeforces 980D Perfect Groups

    题意: 有这样一个问题,给出一个数组,把里面的数字分组,使得每一个组里面的数两两相乘都是完全平方数. 问最少可以分成的组数k是多少. 现在一个人有一个数组,他想知道这个数组的连续子数组中,使得上面的问 ...

  5. Perfect Groups CodeForces - 980D

    链接 题目大意: 定义一个问题: 求集合$S$的最小划分数,使得每个划分内任意两个元素积均为完全平方数. 给定$n$元素序列$a$, 对$a$的所有子区间, 求出上述问题的结果, 最后要求输出所有结果 ...

  6. Codeforces 980 E. The Number Games

    \(>Codeforces \space 980 E. The Number Games<\) 题目大意 : 有一棵点数为 \(n\) 的数,第 \(i\) 个点的点权是 \(2^i\) ...

  7. Codeforces 923 C. Perfect Security

    http://codeforces.com/contest/923/problem/C Trie树 #include<cstdio> #include<iostream> us ...

  8. Codeforces 919 B. Perfect Number

      B. Perfect Number   time limit per test 2 seconds memory limit per test 256 megabytes input standa ...

  9. Codeforces980 D. Perfect Groups

    传送门:>Here< 题目大意:先抛出了一个问题——“已知一个序列,将此序列中的元素划分成几组(不需要连续)使得每一组中的任意两个数的乘积都是完全平方数.特殊的,一个数可以为一组.先要求最 ...

随机推荐

  1. Codeforces 765F Souvenirs

    time limit per test 3 seconds memory limit per test 512 megabytes input standard input output standa ...

  2. 【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元

    [题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不 ...

  3. koa源码阅读[2]-koa-router

    koa源码阅读[2]-koa-router 第三篇,有关koa生态中比较重要的一个中间件:koa-router 第一篇:koa源码阅读-0第二篇:koa源码阅读-1-koa与koa-compose k ...

  4. 使用SPLUNK进行简单Threat Hunting

    通过订阅网上公开的恶意ip库(威胁情报),与SIEM平台中网络流量日志进行匹配,获得安全事件告警. 比如,这里有一个malware urls数据下载的网站,每天更新一次: https://urlhau ...

  5. [node.js] async/await如何优雅处理异常?

    node.js的世界,从callback开始,不会止于async. 所有人都在骂为什么不能完全进化,其实我感觉这就是老外的细心,为了承上.这也就是为什么async其实就是promise一样,假如不是一 ...

  6. Spring源码解读Spring IOC原理

    一.什么是Ioc/DI? IoC 容器:最主要是完成了完成对象的创建和依赖的管理注入等等. 先从我们自己设计这样一个视角来考虑: 所谓控制反转,就是把原先我们代码里面需要实现的对象创建.依赖的代码,反 ...

  7. 生成器(generator)和迭代(iterable , iterator, iteration)

    在搞清楚Generator之前,我们先讨论一下 iterable , iterator, iteration 1.Iterable 我们知道,在Python中所有东西都是object, 比如说变量,容 ...

  8. css 水平、垂直居中

    水平居中 行内元素 行内元素:(img.span.文字等行内元素),通过在父级元素设置 text-align:center 使元素水平居中. 块级元素 块级元素:(div.p.h1...h6.ul.l ...

  9. 20180830 安装git时报错,

    安装:https://blog.csdn.net/u013256816/article/details/54743470 解决问题:https://blog.csdn.net/daojibruce/a ...

  10. openssh升级步骤

    1下载openssh最新版本 2 configure ./configure --prefix= /ssh先配置一下 再在本地安装. make &makeinstall 3 按照/ssh包含内 ...