\(>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. jq消除网页滚动条

    网页有些时候需要能滚动的效果,但是不想要滚动条,我就遇到了这样的需求.自己用jq写了一个垂直滚动条. 纯css也可以实现 .box::-webkit-scrollbar{display:none} 但 ...

  2. 从docker到docker-compose部署一个nginx+flask+mysql+redis应用

    目的是把一个flask项目的mysql数据库.redis数据库.flask应用.nginx服务分别装到四个容器中,然后用docker-compose命令同时启动与关闭 一.安装docker Docke ...

  3. vue使用jsx/axios拦截器设置

    最害怕的就是做过的事情,转几天又忘记了:写过的代码,也模模糊糊不知道哪里去了,所以告诉自己最好把每天遇到的问题记录下来,好,开始. 新公司要搭个vue后台框架,所以用了简简单单的 vue+iview+ ...

  4. 【shell】shell编程(五)-读取参数

    通过前几篇文章的学习,我们学会了shell的基本语法.在linux的实际操作中,我们经常看到命令会有很多参数,例如:ls -al 等等,那么这个参数是怎么处理的呢? 接下来我们就来看看shell脚本对 ...

  5. 71.Adam Taylor玩转MicroZed系列第82部分:简单通信接口第2部分

    By Adam Taylor 从上周的博客开始,我们已经进入到Zedboard(而不是MicroZed)板上的OLED显示模块的编程了.然而在正式进入具体的OLED编程之前,我认为有必要验证我们是否已 ...

  6. linux下C语言实现的内存池【转】

    转自:http://blog.chinaunix.net/uid-28458801-id-4254501.html 操作系统:ubuntu10.04 前言:     在通信过程中,无法知道将会接收到的 ...

  7. C/C++——C语言常用库函数

    本文转载自:https://blog.csdn.net/qq_36955347/article/details/71511900 一.数学函数 调用数学函数时,要求在源文件中包下以下命令行: #inc ...

  8. scikit-learn模块学习笔记(数据预处理模块preprocessing)

    本篇文章主要简单介绍sklearn中的数据预处理preprocessing模块,它可以对数据进行标准化.preprocessing 模块提供了数据预处理函数和预处理类,预处理类主要是为了方便添加到pi ...

  9. 字典对象的 Pythonic 用法(上篇)

    字典对象在Python中作为最常用的数据结构之一,和数字.字符串.列表.元组并列为5大基本数据结构,字典中的元素通过键来存取,而非像列表一样通过偏移存取.笔者总结了字典的一些常用Pyhonic用法,这 ...

  10. php cache类代码(php数据缓存类)

    如果访问量大的话会给数据库造成很大的负担,所以对于变化不经常的内容要做好php 数据cache(缓存)是十分必要的,我做了一个简单的php“文件缓存”的类,希望对大家有所帮助. 思路是这样的: 对于一 ...