CF980D Perfect Groups

思路:

注意到若A * B和B * C都是完全平方数,则A * C也是完全平方数,就不难解答了,要特判0的情况。

实现:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int MAXN = 5005;
 4 int a[MAXN], par[MAXN], buf[MAXN];
 5 typedef long long ll;
 6 void init(int n)
 7 {
 8     for (int i = 0; i < n; i++) par[i] = i;
 9 }
10 int find(int x)
11 {
12     if (par[x] == x) return x;
13     return par[x] = find(par[x]);
14 }
15 void uni(int x, int y)
16 {
17     x = find(x); y = find(y);
18     if (x != y) par[x] = y;
19 }
20 bool check(int x, int y)
21 {
22     if ((ll)a[x] * a[y] < 0) return false;
23     ll tmp = (ll)a[x] * a[y];
24     ll root = sqrt(tmp);
25     return root * root == tmp;
26 }
27 int main()
28 {
29     int n;
30     while (scanf("%d", &n) != EOF)
31     {
32         for (int i = 0; i < n; i++) scanf("%d", &a[i]);
33         init(n);
34         for (int i = 0; i < n; i++)
35         {
36             for (int j = i + 1; j < n; j++)
37             {
38                 if (!a[i] || !a[j])
39                 {
40                     if (!a[i] && !a[j]) uni(i, j);
41                     else continue;
42                 }
43                 if (check(i, j)) uni(i, j);
44             }
45         }
46         vector<int> fa(n, 0), ans(n + 1, 0);
47         int zero = -1;
48         for (int i = 0; i < n; i++)
49         {
50             fa[i] = find(i);
51             if (a[i] == 0) zero = i;
52         }
53         for (int i = 0; i < n; i++)
54         {
55             int cnt = 0;
56             memset(buf, 0, sizeof buf);
57             for (int j = i; j < n; j++)
58             {
59                 if (!buf[fa[j]]) { buf[fa[j]]++; cnt++; }
60                 if (cnt > 1 && zero != -1 && buf[fa[zero]]) ans[cnt - 1]++;
61                 else ans[cnt]++;
62             }
63         }
64         for (int i = 1; i <= n; i++) printf("%d%c", ans[i], i == n ? ‘\n‘ : ‘ ‘);
65     }
66     return 0;
67 }

原文地址:https://www.cnblogs.com/wangyiming/p/9028404.html

时间: 2024-07-31 05:33:21

CF980D Perfect Groups的相关文章

CF 980D Perfect Groups(数论)

CF 980D Perfect Groups(数论) 一个数组a的子序列划分仅当这样是合法的:每个划分中的任意两个数乘积是完全平方数.定义a的权值为a的最小子序列划分个数.现在给出一个数组b,问权值为i的b的子串个数. 这题意真不是人类智慧能轻易描述的.据说此题在比赛场上读题30min,做题5min,做完还WA.果然是坑题. 如果有两个数a和b,a和b的乘积是完全平方数,那么如果a有因子x^2,那么x^2就可以去掉,使a变成a/x^2,结论依然成立.因此我们把所有数的质因子次数mod2,可以发现

Codeforces 980D Perfect Groups

题目大意 设有一个数组A和对A的一个操作f.那么f(A)返回一个最小的k,使得A能分成k组(每组元素不一定连续,但每个元素一定属于某一组),且每组里的任意两个元素的乘积是完全平方数. 现有一个长度为n的数组A,问有多少中情况,从A中取出一段连续的子序列B,使f(B)=k(k = 1...n) 解题思路 首先考虑操作f中的某一组中的某两个数a和b.因为\[ab = k^2(k \in Z)\]所以我们有\[a = \alpha^2t_1\]和\[b=\beta^2t_2\](α.β为整数且t1.t

Codeforces Round #480 (Div. 2) C 贪心 D 数字、思维 E 树上倍增

Codeforces Round #480 (Div. 2) C. Posterized 题意: 给出 n 个数,都是区间 [0,255] 内的数,要你把 [0,255] 划分成多个长度 <=k 的不重叠的子区间.每个数必须包含在一个子区间内,且这个数的价值是这个子区间的左端点.要你输出这 n 数的价值,且这 n 个价值字典序要最小. tags: 首先很明显字典序最小,那对于第 i 个数 p[i] 定它的区间时,左端点肯定要尽可能小.所以我们直接枚举区间 [ p[i]-k+1, p[i] ] 定

屏姨讶们是h25vhc4y6ece5

说到这里,玄老的声音中明显多了几分悲怆的味道"他们都是好孩子,尽管他们未能真正毕业,但在学院的名册上,始终有着他们的名字.他们以学院的理想为理想,他们并不是没有毕业的实力,而是为了学院的理想战死了."-----------------------------------------------------------------------------周漪忍不住道:"有什么是学院不能帮你解决的?非要自己一个人去面对?难道你说出来我们会不帮你么?"可是--,聚能魂导炮

僦檬哨招瓤kdqg84x5hodqk1

台上,天煞斗罗黄津绪并没有催促双方进行下一场比赛,因为比赛台在刚才一战中被破坏的实在是太厉害了,马小桃的黑色凤凰火焰足足灼烧了一分多钟才消失.如果不进行修补,已经没法再继续比赛了.此时正由几位实力不俗的土系魂师快速修复着.自从进入史莱克学院之后,他们一直都在紧张的学习和修炼,哪有什么放松的时间.凌落宸的疑问则只是落在霍雨浩一个人身上,"极致之冰?"贝贝心中早有定计,低声道:"第一场我们赢了,我们就已经处于主动之中.我们现在最希望出现的.是第二场他们在冲动之下派出两名魂王,或者

滦谇淋坌招r6un44y803l1xog9y18

求收藏.求推荐票.求会员点击.刺入他额头的青色噬灵刻刀轻微震颤,奇异的是,那破入的创口并没有鲜血流出,反而是那噬灵刻刀竟然缓缓软化,化为青碧色的液体顺着那创口流入霍雨浩头部之中.霍雨浩呵呵一笑,道:"发现就发现呗,王冬,你现在是不是觉得特别虚弱,一点力气都用不出来啊?""战争最后虽然胜利了,但我们唐门暗器的作用也受到了极大的质疑.从那以后,各国开始大幅度削减对我们制作暗器的采购.而我们唐门赚钱虽然不少,但按照第一代门主的意思,大部分收入全都捐赠了出去.用来改善穷苦地区的平民生

使用Search查询Office 365 Groups

原文地址 我已经使用新的Office 365 Groups 功能有一段时间了,我想看看我在普通的SharePoint Online site怎么使用它们.我今天的例子里,我创建了两个 public groups 和三个private groups. 我第一个想法是使用Search. 因为我知道,group在后台,是由site collection来存储的.我只是要查找到,它使用的是哪一个WebTemplate .你可以在search中,通过查看一个文档,容易的找到site collection的

poj 2408 Anagram Groups(hash)

题目链接:poj 2408 Anagram Groups 题目大意:给定若干个字符串,将其分组,按照组成元素相同为一组,输出数量最多的前5组,每组按照字典序输出所 有字符串.数量相同的输出字典序较小的一组. 解题思路:将所有的字符串统计字符后hash,排序之后确定每组的个数并且确定一组中字典序最小的字符串.根据个数 以及字符串对组进行排序. #include <cstdio> #include <cstring> #include <vector> #include &

No plugin found for prefix &#39;jetty&#39; in the current project and in the plugin groups

现在Jetty的版本已经到9了,也早已经在Eclipse的门下了.所以有很多groupId,比如:org.eclipse.jetty.org.mortbay.jetty.这些都可以用的哦. 我在使用MyEclipse结合maven操作jetty作为开发的服务器,这开开发比较方便. 当我运行命令: jetty:run 出现: [ERROR] No plugin found for prefix 'jetty' in the current project and in the plugin gro