cf round480D Perfect Groups
题意:给一个序列,对于每一个连续的区间,区间内的数至少分成几个组,使得每个组内的数任意2个相乘是一个完全平方数(包括0)。 输出每个组数的个数。
$n \leq 5000 , |a_i| \leq 10^8$
我们发现,对于一个数$x$,我们把$x$所有成对的相同质因子除去之后得到的数是$f(x)$
那么分到同一个组的所有数的$f(x_i)$相同,0可以被分到任何集合
明显我们可以$n^2$做这道题,枚举一个子序列的右端点,然后从右到左枚举左端点,顺便维护最小组数。
对于加入一个数$x$,我们需要知道当前区间里面的数是否有和$x$相同的,如果有相同的,就加入那个集合,否则就新开一个集合
所以对于每一个点,我们预处理下一个和它相同的数的位置
当然0的情况不同,随便加到任意一个集合就可以了
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<set>
using namespace std;
#define ll long long
#define db double
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
const int maxn=5000+7,M=120;
ll n,a[maxn],nxt[maxn],ans[maxn];
set<ll> prime;
set<ll>::iterator it; char cc;ll ff;
template<typename T>void read(T& aa) {
aa=0;ff=1; cc=getchar();
while(cc!='-'&&(cc<'0'||cc>'9')) cc=getchar();
if(cc=='-') ff=-1,cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
aa*=ff;
} ll qp(ll x,ll k,ll mod) {
ll rs=1;
while(k) {
if(k&1) rs=rs*x%mod;
k>>=1; x=x*x%mod;
}
return rs;
} ll gcd(ll x,ll y) {return y==0? x:gcd(y,x%y);} bool isprime(ll n) {
if(n==2||n==3||n==5||n==7) return 1;
if(n<2||(n%6!=1&&n%6!=5)) return 0;
ll m=n-1,t=0,x,y;
while((m&1)==0) t++,m>>=1;
For(qaq,1,20) {
x=rand()%(n-2)+2;
x=qp(x,m,n);
For(i,1,t) {
y=x*x%n;
if(y==1&&x!=1&&x!=n-1) return 0;
x=y;
}
if(x!=1) return 0;
}
return 1;
} ll prho(ll n,ll m) {
ll x=rand()%(n-1)+1,y=0;
for(ll i=1,k=1,d;y!=x;++i) {
if(i==k) {y=x;k<<=1;}
x=(x*x+m)%n;
d=gcd((y-x+n)%n,n);
if(d>1&&d<n) return d;
}
return n;
} void find(ll n,ll m) {
if(isprime(n)) {
it=prime.find(n);
if(it==prime.end()) prime.insert(n);
else prime.erase(it);
return;
}
ll p=n; while(p>=n) p=prho(n,m--);
find(p,M); find(n/p,M);
} ll get_num(ll n) {
// cerr<<"get_num("<<n<<")\n";
if(n==1||n==0) return n;
find(n,M);
ll rs=1;
while(!prime.empty()) {
it=prime.begin();
rs*=*it;
prime.erase(it);
}
return rs;
} int main() {
read(n); ll x;
For(i,1,n) {
// cerr<<"get a["<<i<<"]:";
read(x);
a[i]=get_num(abs(x));
if(x<0) a[i]=-a[i];
}
For(i,1,n) {
nxt[i]=n+1;
For(j,i+1,n) if(a[j]==a[i]) {nxt[i]=j;break;}
}
int now;
For(i,1,n) {
now=0;
Rep(j,i,1) {
if(a[j]&&nxt[j]>i) ++now;
++ans[now];
}
}
ans[1]+=ans[0];
For(i,1,n) printf("%lld ",ans[i]);
printf("\n");
return 0;
}
cf round480D Perfect Groups的更多相关文章
- CF 980D Perfect Groups(数论)
CF 980D Perfect Groups(数论) 一个数组a的子序列划分仅当这样是合法的:每个划分中的任意两个数乘积是完全平方数.定义a的权值为a的最小子序列划分个数.现在给出一个数组b,问权值为 ...
- Codeforces 980 D. Perfect Groups
\(>Codeforces\space980 D. Perfect Groups<\) 题目大意 : 设 \(F(S)\) 表示在集合\(S\)中把元素划分成若干组,使得每组内元素两两相乘 ...
- Codeforces980 D. Perfect Groups
传送门:>Here< 题目大意:先抛出了一个问题——“已知一个序列,将此序列中的元素划分成几组(不需要连续)使得每一组中的任意两个数的乘积都是完全平方数.特殊的,一个数可以为一组.先要求最 ...
- 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 R 633 div 1 1338 C. Perfect Triples 打表找规律
LINK:Perfect Triples 初看这道题 一脸懵逼.. 完全没有思路 最多就只是发现一点小规律 即. a<b<c. 且b的最大的二进制位一定严格大于a b的最大二进制位一定等于 ...
- cf Perfect Pair
http://codeforces.com/contest/318/problem/C #include <cstdio> #include <cstring> #includ ...
随机推荐
- 查询sitemap中重复的记录
; ;
- Neo4j 第四篇:使用.NET驱动访问Neo4j
本文使用的IDE是Visual Studio 2015 ,驱动程序是Neo4j官方的最新版本:Neo4j.Driver,创建的类库工程(Project)要求安装 .NET Framework 4.5. ...
- java连接neo4j
呼.博客要落灰了 记录一下Java连接neo4j的问题. 首先是neo4j的下载和配置,基本参考https://blog.csdn.net/appleyk/article/details/790918 ...
- Java发送http请求发送json对象
直接上代码: http工具类: public static String httpPostWithjson(String url, String json) throws IOException { ...
- 模板:有旋treap
有旋转的treap,其实rotate比较难理解 没关系,上板子: 题目还是普通平衡树 #include<iostream> #include<cstdio> #include& ...
- Django项目:CRM(客户关系管理系统)--74--64PerfectCRM实现CRM课程排名详情
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...
- anchor-free : CornerNet 和 CenterNet 简要笔记
CornerNethourglass network -> prediction module = corner pooling -> heatmaps + embedding + off ...
- light oj 1071 dp(吃金币升级版)
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> ...
- C# 利用Newtonsoft.Json 序列化生成Json数据
现在需要将一些数据转化成json格式返回给调用者, 使用Newtonsoft.Json.DLL库来帮助我们序列化 举例: {"300033":{"MC":&qu ...
- Java文件写入
一,FileWritter写入文件 FileWritter, 字符流写入字符到文件.默认情况下,它会使用新的内容取代所有现有的内容,然而,当指定一个true (布尔)值作为FileWritter构造函 ...