题意:

有这样一个问题,给出一个数组,把里面的数字分组,使得每一个组里面的数两两相乘都是完全平方数。

问最少可以分成的组数k是多少。

现在一个人有一个数组,他想知道这个数组的连续子数组中,使得上面的问题答案分别为1到n的数组有多少个。

第一个样例

2

5 5

子数组有[5],[5],[5 5]三个,这三个组最少可以分别分为1 1 1组,使得每个组的任意两个数相乘都是平方数。

思路:

感谢js帮本智障debug。

首先对于一个不为0的数,如果把它的所有完全平方数的因子去掉,那么是不会影响结果的。

所以首先把每个数的完全平方数因子去掉,注意负数的处理

然后剩下的数都可以表示为一个或者多个质数的乘积,那么两两相乘为平方数只有一种情况,就是两个数字相等。

所以问题转化为了求一个数组的连续子数组中有多少个不相等的数字,那么这个子数组就可以最少分为几个组。

离散化统计每个区间内的不同的数字就行了,用set或者map会T,不知道为什么。。。复杂度O(n^2)。

注意有0的时候,除非每个元素都是0,否则0可以加入任何一个分组,得特殊处理一下,具体看代码。

代码:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. #include <set>
  5. #include <math.h>
  6. using namespace std;
  7. const int N = ;
  8. int a[N];
  9. int b[N];
  10. int c[N];
  11. bool vis[N];
  12. int mabs(int x)
  13. {
  14. return x >= ? x : -x;
  15. }
  16. int main()
  17. {
  18. int n;
  19. int cnt = ;
  20. scanf("%d",&n);
  21. for (int i = ;i < n;i++)
  22. {
  23. scanf("%d",&a[i]);
  24. if (a[i] != ) cnt++;
  25. }
  26. if (cnt == )
  27. {
  28. printf("%d ",n * (n + ) / );
  29. for (int i = ;i < n;i++) printf("0 ");
  30. }
  31. else
  32. {
  33. for (int i = ;i < n;i++)
  34. {
  35. if (a[i] == ) continue;
  36. int tmp = mabs(a[i]);
  37. for (int j = ;j * j <= tmp;j++)
  38. {
  39. int t = j * j;
  40. while (a[i] % t == )
  41. {
  42. a[i] /= t;
  43. }
  44. //if (a[i] < t) break;加了这个就wa,卡了一晚上,考虑的应该是绝对值的情况
  45. }
  46. }
  47. for (int i = ;i < n;i++) c[i] = a[i];
  48. sort(c,c+n);
  49. int js = unique(c,c+n) - c;
  50. for (int i = ;i < n;i++)
  51. {
  52. if (a[i] == ) continue;
  53. int p = lower_bound(c,c+js,a[i]) - c + ;
  54. a[i] = p;
  55. }
  56. for (int i = ;i < n;i++)
  57. {
  58. memset(vis,,sizeof(vis));
  59. int num = ;
  60. for (int j = i;j < n;j++)
  61. {
  62. if (!vis[a[j]] && a[j] != )
  63. {
  64. num++;
  65. vis[a[j]] = ;
  66. }
  67. int tt = max(num,);
  68. b[tt]++;
  69. }
  70. }
  71. for (int i = ;i <= n;i++)
  72. {
  73. printf("%d ",b[i]);
  74. }
  75. }
  76. return ;
  77. }

codeforces 980D Perfect Groups的更多相关文章

  1. Codeforces 980D Perfect Groups 计数

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

  2. CF 980D Perfect Groups(数论)

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

  3. Codeforces 980 D. Perfect Groups

    \(>Codeforces\space980 D. Perfect Groups<\) 题目大意 : 设 \(F(S)\) 表示在集合\(S\)中把元素划分成若干组,使得每组内元素两两相乘 ...

  4. Perfect Groups CodeForces - 980D

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

  5. CodeForces 173E Camping Groups 离线线段树 树状数组

    Camping Groups 题目连接: http://codeforces.com/problemset/problem/173/E Description A club wants to take ...

  6. Codeforces 986D Perfect Encoding FFT 分治 高精度

    原文链接https://www.cnblogs.com/zhouzhendong/p/9161557.html 题目传送门 - Codeforces 986D 题意 给定一个数 $n(n\leq 10 ...

  7. [CodeForces - 919B] Perfect Number

    题目链接:http://codeforces.com/problemset/problem/919/B AC代码: #include<cstdio> using namespace std ...

  8. Codeforces 948D Perfect Security(字典树)

    题目链接:Perfect Security 题意:给出N个数代表密码,再给出N个数代表key.现在要将key组排序,使key组和密码组的亦或所形成的组字典序最小. 题解:要使密码组里面每个数都找到能使 ...

  9. CodeForces - 233A Perfect Permutation

    A. Perfect Permutation time limit per test: 2 seconds memory limit per test: 256 megabytes input: st ...

随机推荐

  1. 内核poll机制

    内核版本:linux2.6.22.6 硬件平台:JZ2440 驱动源码 poll_key_int_drv.c : #include <linux/module.h> #include &l ...

  2. 1-3-编译Linux内核

    1-3-编译Linux内核 1.将Linux源码包拷贝到共享文件夹. 2.进入共享文件夹. 3.解压,命令#tar xvfj Kernel_3.0.8_TQ210_for_Linux_v2.2.tar ...

  3. Mysql索引基础原理

    索引的概念 索引是特殊数据结构:  定义在查找时作为查找条件的字段 索引实现在存储引擎 功能: 1.约束数据 2.加速查询 优点: 索引可以降低服务需要扫描的数据量,减少了IO次数 索引可以帮助服务器 ...

  4. 001-js-时间格式化

    方法一. // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1 ...

  5. CAS缺点

      CAS虽然很高效的解决原子操作,但是CAS仍然存在三大问题.ABA问题,循环时间长开销大和只能保证一个共享变量的原子操作 1.  ABA问题.因为CAS需要在操作值的时候检查下值有没有发生变化,如 ...

  6. Elemet-技巧

    <el-table-column prop="> </el-table-column> 效果: append-to-body 解决el-dialog 弹窗遮罩为题 & ...

  7. JavaScript 全栈工程师培训教程 - 阮一峰

    http://www.ruanyifeng.com/blog/2016/11/javascript.html https://github.com/ruanyf/jstraining 我现在的技术方向 ...

  8. 网络编程——socket编程

    一.客户端/服务端架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网企业处处是C/S架构 C/S架构与socket的关系:学习socket就是为了完成C/S架构的开发 二.OSI七层 一个 ...

  9. 2018-2019-1 20189221《Linux内核原理与分析》第五周作业

    2018-2019-1 20189221<Linux内核原理与分析>第五周作业 实验四 实验过程 当用户态进程调用一个系统调用时,cpu切换到内核态并开始执行一个内核函数. 在Linux中 ...

  10. [LeetCode] 607. Sales Person_Easy tag: SQL

    Description Given three tables: salesperson, company, orders.Output all the names in the table sales ...