\(>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. 集合框架小结-Collection

    1.集合框架作为处理对象的容器存在,基本接口是Collection,相对于数组而言的话,集合框架只能存储对象,但是长度是可变的.集合框架的关系图如下: 主要的内容是list.set.map, List ...

  2. CALayer---iOS-Apple苹果官方文档翻译之CALayer

    CHENYILONG Blog CALayer---iOS-Apple苹果官方文档翻译之CALayer CALayer /*技术博客http://www.cnblogs.com/ChenYilong/ ...

  3. indexof()函数

    js 判断字符串是否包含某字符串,String对象中查找子字符,indexOf, 成功,返回索引值,失败返回 -1. 转载: http://www.cnblogs.com/fishtreeyu/arc ...

  4. java对象与json互转

    package com.liveyc; import java.io.StringWriter; import org.junit.Test; import com.fasterxml.jackson ...

  5. python初步学习-面向对象之类(一)

    python 面向对象 python 从设计之初就已经是一门面向对象的语言,正因为如此,在python中创建一个类和对象是很容易的. 对象对象奇数简介 类(Class): 用于描述具有相同的属性和方法 ...

  6. Docker微容器Alpine Linux

    Alpine 操作系统是一个面向安全的轻型 Linux 发行版. 它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功 ...

  7. 初窥ThinkPHP

    MVC全称(Model View Controller) Model:模型(可以理解位数据库操作模型) View:视图(视图显示) Controller:(控制器) 简单的说框架就是一个类的集合.集合 ...

  8. 去除\ufeff的解决方法,python语言

    语言:python 编程工具:pycharm 硬件环境:win10 64位 读取文件过程中发现一个问题:已有记事本文件(非空),转码 UTF-8,复制到pycharm中,在开始位置打印结果会出现  \ ...

  9. PGSql

    http://www.yiibai.com/postgresql/ http://www.postgresql.org/ http://blog.csdn.net/wulex/article/deta ...

  10. Delphi根据字符串实例化对象

    我们可以通过ClassRegistry单元的TClassRegistry类很轻松的根据字符串创建出对象. 下面是该类几个主要函数的说明: // 获取TClassRegistry自身的单例引用class ...