Codeforces980 D. Perfect Groups
传送门:>Here<
题目大意:先抛出了一个问题——“已知一个序列,将此序列中的元素划分成几组(不需要连续)使得每一组中的任意两个数的乘积都是完全平方数。特殊的,一个数可以为一组。先要求最少分几组。”在这个问题的基础上,给出一个长度为n的序列$a_i$,该序列有\(\frac{n(n+1)}{2}\)个子串,求每个子串对于上面这个问题最少划分几次。并分别统计最少划分k次的子串有几个。$(n \leq 5000, |a_i| \leq 10^8)$
解题思路
两个数的乘积为完全平方数,当且仅当两个数都为完全平方数,或者两个数相等。我们考虑放宽一下要求,如果只要求两个数相等,那么题目就变成求区间颜色个数的经典问题了。我们发现,如果我们将每个数的完全平方因子除去,那么所有完全平方数都变成1了,然而并不会影响答案。这样就只剩下两数相等的条件了。
求解所有区间的颜色个数和——常规做法是只让首次出现的颜色产生贡献。这需要我们统计每个数之前出现的相同数的位置。
关于除掉完全平方因子,注意要从大到小除。
Code
/*By QiXingzhi*/
#include <cstdio>
#include <cmath>
#define r read()
#define Max(a,b) (((a)>(b)) ? (a) : (b))
#define Min(a,b) (((a)<(b)) ? (a) : (b))
using namespace std;
typedef long long ll;
const int N = ;
const int INF = ;
inline int read(){
int x = ; int w = ; register int c = getchar();
while(c ^ '-' && (c < '' || c > '')) c = getchar();
if(c == '-') w = -, c = getchar();
while(c >= '' && c <= '') x = (x << ) +(x << ) + c - '', c = getchar();
return x * w;
}
int n,m;
int a[N],ans[N],f[N];
inline int GetNotSquare(int x){
int k = ceil(sqrt(abs(x)));
for(int i = ; i <= k; ++i){
while(x % (i*i) == ){
x /= i*i;
}
}
return x;
}
int main(){
n = r;
for(int i = ; i <= n; ++i){
a[i] = r;
a[i] = GetNotSquare(a[i]);
}
f[] = -;
for(int i = ; i <= n; ++i){
f[i] = -;
for(int j = i-; j >= ; --j){
if(a[i] == a[j]){
f[i] = j;
break;
}
}
}
for(int i = ; i <= n; ++i){
int num = ;
for(int j = i; j <= n; ++j){
if(f[j] < i && a[j] != ){
++num;
}
if(num == ){
++ans[];
}
else ++ans[num];
}
}
for(int i = ; i <= n; ++i) printf("%d ",ans[i]);
return ;
}
Codeforces980 D. Perfect Groups的更多相关文章
- Codeforces 980 D. Perfect Groups
\(>Codeforces\space980 D. Perfect Groups<\) 题目大意 : 设 \(F(S)\) 表示在集合\(S\)中把元素划分成若干组,使得每组内元素两两相乘 ...
- CF 980D Perfect Groups(数论)
CF 980D Perfect Groups(数论) 一个数组a的子序列划分仅当这样是合法的:每个划分中的任意两个数乘积是完全平方数.定义a的权值为a的最小子序列划分个数.现在给出一个数组b,问权值为 ...
- Codeforces 980D Perfect Groups 计数
原文链接https://www.cnblogs.com/zhouzhendong/p/9074164.html 题目传送门 - Codeforces 980D 题意 $\rm Codeforces$ ...
- codeforces 980D Perfect Groups
题意: 有这样一个问题,给出一个数组,把里面的数字分组,使得每一个组里面的数两两相乘都是完全平方数. 问最少可以分成的组数k是多少. 现在一个人有一个数组,他想知道这个数组的连续子数组中,使得上面的问 ...
- Perfect Groups CodeForces - 980D
链接 题目大意: 定义一个问题: 求集合$S$的最小划分数,使得每个划分内任意两个元素积均为完全平方数. 给定$n$元素序列$a$, 对$a$的所有子区间, 求出上述问题的结果, 最后要求输出所有结果 ...
- cf980d Perfect Groups
题意 定义一个串的权值是将其划分成 \(k\) 组,使得每一组在满足"从组里选出一个数,再从组里选出一个数,它们的乘积没有平方因子"这样的前提时的最小的 \(k\).每组的数不必相 ...
- cf round480D Perfect Groups
题意:给一个序列,对于每一个连续的区间,区间内的数至少分成几个组,使得每个组内的数任意2个相乘是一个完全平方数(包括0). 输出每个组数的个数. $n \leq 5000 , |a_i| \leq 1 ...
- Understanding Kafka Consumer Groups and Consumer Lag
In this post, we will dive into the consumer side of this application ecosystem, which means looking ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
随机推荐
- Ubuntu: 软件库(software repositories)
Linux 生态下,几乎每个发行版都有自己的软件库(software repositories),Ubuntu 当然也不例外.Ubuntu 提供了四个不同的软件库,分别是 main.restricte ...
- JSON Web Token 入门教程
原文地址:http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html JSON Web Token(缩写 JWT)是目前最流 ...
- SQLServer 存储过程+定时任务发邮件
SQLServer 代理发邮件需要开启SQL Server 代理服务器,然后,在[管理]-[数据库邮件]中,右键点击配置数据库邮件. 我用的是腾讯的企业邮箱,个人的163邮箱略微不同.下图是相关邮件的 ...
- MySQL复制表的方式以及原理和流程
复制表的俩种方式: 第一.只复制表结构到新表 create table 新表 select * from 旧表 where 1=2 或者 create table 新表 like 旧表 第二.复制表结 ...
- 逻辑回归为什么用sigmoid函数
Logistic回归目的是从特征学习出一个0/1分类模型,而这个模型是将特性的线性组合作为自变量,由于自变量的取值范围是负无穷到正无穷. 因此,使用logistic函数(或称作sigmoid函数)将自 ...
- html中怎么设置性别默认选择
<html><body> <form action="/example/html/form_action.asp" method="get& ...
- laravel打印sql
DB::connection()->enableQueryLog(); print_r(DB::getQueryLog());
- Idea批量修改变量名
Idea批量修改变量名.在变量名上进行rename操作,所有的同名变量都会自动更改. 快捷键:ALT+SHIFT+R
- day 7-18 mysql case when语句
概述: sql语句中的case语句与高级语言中的switch语句,是标准sql的语法,适用于一个条件判断有多种值的情况下分别执行不同的操作. 首先,让我们看一下CASE的语法.在一般的SELECT中, ...
- composer 下载包慢的解决方法
方法一: 修改 composer 的全局配置文件(推荐方式) 打开命令行窗口(windows用户)或控制台(Linux.Mac 用户)并执行如下命令: composer config -g repo. ...