CF 980D Perfect Groups(数论)
CF 980D Perfect Groups(数论)
一个数组a的子序列划分仅当这样是合法的:每个划分中的任意两个数乘积是完全平方数。定义a的权值为a的最小子序列划分个数。现在给出一个数组b,问权值为i的b的子串个数。
这题意真不是人类智慧能轻易描述的。据说此题在比赛场上读题30min,做题5min,做完还WA。果然是坑题。
如果有两个数a和b,a和b的乘积是完全平方数,那么如果a有因子x2,那么x2就可以去掉,使a变成a/x^2,结论依然成立。因此我们把所有数的质因子次数mod2,可以发现结论仍然不变。
因此,在一个划分内的数必须完全相同或者有数为零(涉及乘除法一定要考虑零啊啊啊)。n^2dp即可。
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=5005;
int n, a[maxn], b[maxn], cnt[maxn]; //cnt[i]储存i有几个
int k, ans[maxn], id0;
int deal(int x){
int flag;
if (x<0) x=-x, flag=-1; else flag=1;
for (int i=2; i*i<=x; ++i)
while (x%(i*i)==0) x/=i*i;
return x*flag;
}
int main(){
scanf("%d", &n); int t; id0=-1;
for (int i=1; i<=n; ++i){
scanf("%d", &t), a[i]=b[i]=deal(t);
if (!a[i]) id0=0;
}
sort(b+1, b+1+n);
if (!id0) id0=lower_bound(b+1, b+1+n, 0)-b;
for (int i=1; i<=n; ++i)
a[i]=lower_bound(b+1, b+1+n, a[i])-b;
for (int i=1; i<=n; ++i){
for (int j=1; j<=n; ++j) cnt[j]=0; k=0; //k:[i,j]不同元素的数目
for (int j=i; j<=n; ++j){
if (a[j]==id0){
if (!k) ++ans[1]; else ++ans[k];
continue;
}
if (!cnt[a[j]]) ++k;
++cnt[a[j]]; ++ans[k];
}
}
for (int i=1; i<=n; ++i) printf("%d ", ans[i]);
return 0;
}
CF 980D Perfect Groups(数论)的更多相关文章
- Codeforces 980D Perfect Groups 计数
原文链接https://www.cnblogs.com/zhouzhendong/p/9074164.html 题目传送门 - Codeforces 980D 题意 $\rm Codeforces$ ...
- codeforces 980D Perfect Groups
题意: 有这样一个问题,给出一个数组,把里面的数字分组,使得每一个组里面的数两两相乘都是完全平方数. 问最少可以分成的组数k是多少. 现在一个人有一个数组,他想知道这个数组的连续子数组中,使得上面的问 ...
- cf round480D Perfect Groups
题意:给一个序列,对于每一个连续的区间,区间内的数至少分成几个组,使得每个组内的数任意2个相乘是一个完全平方数(包括0). 输出每个组数的个数. $n \leq 5000 , |a_i| \leq 1 ...
- Codeforces 980 D. Perfect Groups
\(>Codeforces\space980 D. Perfect Groups<\) 题目大意 : 设 \(F(S)\) 表示在集合\(S\)中把元素划分成若干组,使得每组内元素两两相乘 ...
- Perfect Groups CodeForces - 980D
链接 题目大意: 定义一个问题: 求集合$S$的最小划分数,使得每个划分内任意两个元素积均为完全平方数. 给定$n$元素序列$a$, 对$a$的所有子区间, 求出上述问题的结果, 最后要求输出所有结果 ...
- Codeforces980 D. Perfect Groups
传送门:>Here< 题目大意:先抛出了一个问题——“已知一个序列,将此序列中的元素划分成几组(不需要连续)使得每一组中的任意两个数的乘积都是完全平方数.特殊的,一个数可以为一组.先要求最 ...
- cf980d Perfect Groups
题意 定义一个串的权值是将其划分成 \(k\) 组,使得每一组在满足"从组里选出一个数,再从组里选出一个数,它们的乘积没有平方因子"这样的前提时的最小的 \(k\).每组的数不必相 ...
- CF 984C Finite or not? (数论)
CF 984C Finite or not? (数论) 给定T(T<=1e5)组数据,每组数据给出十进制表示下的整数p,q,b,求问p/q在b进制意义下是否是有限小数. 首先我们先把p/q约分一 ...
- UVA 10622 - Perfect P-th Powers(数论)
UVA 10622 - Perfect P-th Powers 题目链接 题意:求n转化为b^p最大的p值 思路:对n分解质因子,然后取全部质因子个数的gcd就是答案,可是这题有个坑啊.就是输入的能够 ...
随机推荐
- C++(二)— STL容器的基本用法
1.vector基本操作 关于vector简单的讲就是一个动态增长的数组,里面有一个指针指向一片连续的内存空间,当空间装不下的时候会自动申请一片更大的空间(空间配置器)将原来的数据拷贝到新的空间,然后 ...
- UVA 10158 War(并查集)
//思路详见课本 P 214 页 思路:直接用并查集,set [ k ] 存 k 的朋友所在集合的代表元素,set [ k + n ] 存 k 的敌人 所在集合的代表元素. #include< ...
- scanf和cin的返回值
需要连续从标准输入读取数据时,可以采用下面两种不同的方式判断文件结束: [cpp] view plaincopy int i; while(scanf("%d",&i) ...
- 理解WCF(第二部分,部分參考他人)
該篇的主題:wcf到底是怎工作的? 一.什么是分布式: 首先看一张图: 由上图对比我们可以发现,区别就是前者把服务器放在了一台电脑上,而后者把服务器放在了多台电脑上.这样多台电脑处理起来的速度比一台电 ...
- Android模拟器adb命令介绍
在SDK的Tools文件夹下包含着Android模拟器操作的重要命令adb,adb的全称为Android Debug Bridge,就是调试桥的作用 在SDK的Tools文件夹下包含着Android模 ...
- H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式(包含AAC部分解析)
H.264 RTPpayload 格式------ H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: +------------ ...
- ACM学习历程—HDU 3092 Least common multiple(数论 && 动态规划 && 大数)
Description Partychen like to do mathematical problems. One day, when he was doing on a least common ...
- Access中一句查询代码实现Excel数据导入导出
摘 要:用一句查询代码,写到vba中实现Excel数据导入导出,也可把引号中的SQL语句直接放到查询分析器中执行正 文: 导入数据(导入数据时第一行必须是字段名): DoCmd.RunSQL &quo ...
- Linux ssh 不需要输入密码的方法
采用证书的方法可以解决ssh不需要输入密码的问题. 本文采用CentOS的操作系统,创建SSH的key,并在两台或多台机器间实现信任.从而实现SSH登录不需要输入密码的功能. 首先,在一台机器上创建S ...
- 使用hibernate validator出现
1.javax.validation.UnexpectedTypeException: No validator could be found for type: java.lang.Integer ...