CC Subarray LCM (数学)
题目连接:http://www.codechef.com/problems/SUBLCM
题意:给定一个序列,求最长连续子序列满足 LCM(Ai,Ai+1...Aj) =Ai*Ai+1*...*Aj。
分析:若要满足 LCM(Ai,Ai+1...Aj) =Ai*Ai+1*...*Aj,必须子序列内两两互质(没有相同质因子),因此首先筛素因子。
由dp[i]表示从a[i]开始往回走,最远到达pos还满足 LCM(Apos,Ai+1...Ai) =Apos*Apos+1*...*Ai ,则dp[i]取决于dp[i-1]和之前有没有最右出现a[i]含有的质因子。
用一个数组记录每个质因子最右出现的位置,则dp[i]=max(dp[i-1],last)(last表示a[i]含有的质因子出现最右的位置)
最后ans=max(ans,i-dp[i]+1)即可。
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 100000000
#define inf 0x3f3f3f3f
#define N 1000010
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
vector<int>PrimeFactor[N];
int prime[N];
int gcd(int a,int b)
{
return a%b==?b:gcd(b,a%b);
}
void init()
{
for(int i=;i<N;i++)//筛素因子
{
if(!prime[i])
{
for(int j=i;j<N;j+=i)
PrimeFactor[j].push_back(i),prime[j]=;
}
}
}
int pos[N],dp[N],a[N];
int main()
{
init();
int T,n,x;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
FILL(pos,);
int ans=;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
x=a[i];
int maxlast=;
for(int j=,sz=PrimeFactor[x].size();j<sz;j++)//找出a[i]含有的质因子最右位置
{
int factor=PrimeFactor[x][j];
maxlast=max(maxlast,pos[factor]+);
pos[factor]=i;
}
if(i>&&gcd(a[i],a[i-])!=)
{
dp[i]=i;continue;
}
dp[i]=max(maxlast,dp[i-]);
}
for(int i=;i<=n;i++)ans=max(ans,i-dp[i]+);
if(ans<=)ans=-;
printf("%d\n",ans);
}
}
CC Subarray LCM (数学)的更多相关文章
- hdu 4497 GCD and LCM 数学
GCD and LCM Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4 ...
- Codeforces Round #613 (Div. 2) C. Fadi and LCM (数学)
题意:给你一个正整数\(x\),找两个正整数\(a\),\(b\),使得\(lcm(a,b)=x\),并且\(max(a,b)\)最小. 题解:我们知道,\(lcm(a,b)=a*b/gcd(a,b) ...
- Codeforces #6241 div2 C. Orac and LCM (数学)
题意:给你一个数列,求所有子序列对的\(lcm\),然后求这些所有\(lcm\)的\(gcd\). 题解:我们对所有数分解质因数,这里我们首先要知道一个定理: 对于\(n\)个数,假如某个质数\( ...
- 【XSY2470】lcm 数学
题目大意 \(t\)组询问, 每组询问给定\(n\),求\(\sum_{k=1}^n[n,k]\),其中\([a,b]\)表示\(a\)和\(b\)的最小公倍数 . \(t\leq 300000,n\ ...
- Bzoj 1853: [Scoi2010]幸运数字 容斥原理,深搜
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 1774 Solved: 644[Submit][Status] ...
- 一位学长的ACM总结(感触颇深)
发信人: fennec (fennec), 信区: Algorithm 标 题: acm 总结 by fennec 发信站: 吉林大学牡丹园站 (Wed Dec 8 16:27:55 2004) AC ...
- PTA 社交网络图中结点的“重要性”计算(30 分)
7-12 社交网络图中结点的“重要性”计算(30 分) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的一种相互 ...
- scau 2015寒假训练
并不是很正规的.每个人自愿参与自愿退出,马哥找题(马哥超nice么么哒). 放假第一周与放假结束前一周 2015-01-26 http://acm.hust.edu.cn/vjudge/contest ...
- PTA 7-12(图) 社交网络图中结点的“重要性”计算 最短路
7-12(图) 社交网络图中结点的“重要性”计算 (30 分) 在社交网络中,个人或单位(结点)之间通过某些关系(边)联系起来.他们受到这些关系的影响,这种影响可以理解为网络中相互连接的结点之间蔓延的 ...
随机推荐
- new对象数组时的内存布局
#include <iostream> #include <limits> using namespace std; #define SAFE_DELETE(x) \ { \ ...
- 俄罗斯方块SDK版
前言 本来可以从俄罗斯方块控制台版改一版, 将UI接口换掉, 变成SDK版. 正好放假了, 有时间. 就用了一个星期来重头做一个新版, 享受一下静下心来, 有条不紊干活的感觉^_^ 这个工程用来验证S ...
- 基于visual Studio2013解决面试题之0410计算二进制中1的个数
题目
- jsp静态化之简单介绍
package com.zwd.text; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputS ...
- Java 7如何操纵文件属性
Java 7如何操纵文件属性 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 准备写点基础性的文章,Java 7已经出来很长一段时间了,但是很多Java程 ...
- vim 操作指令2
VIM命令大全 光标控制命令 命令 光标移动 h 向左移一个字符 j 向下移一行 k 向上移一行 l 向右移一个字符 G 移到文件的最后一行 w 移到下一个字的开头 W 移到下一个字的开头,忽略标点符 ...
- org.apache.jasper.JasperException: java.lang.ClassCastException
异常信息: org.apache.jasper.JasperException: java.lang.ClassCastException:org.apache.catalina.util.Defau ...
- POJ 3619 Speed Reading(简单题)
[题意简述]:有K头牛,N页书,每次第i头牛每分钟仅仅能读Si页书,连续读Ti分钟,之后歇息Ri分钟.如今问我们第i头牛花费多少时间能够读完这N页书. [分析]:简单的模拟 //220K 32Ms # ...
- C/C++中constkeyword
今天在做一个趋势笔试题的时候.才让我有了系统把constkeyword好好总结一下的冲动,由于这个关键词大大小小好多地方都出现过,出现频率很高,而每次仅仅是简短的把答案看了一下,没有真正将其整个使用方 ...
- 状态压缩动态规划 -- 棋盘问题 POJ 1321
一个 N * N 的棋盘上面,有些格子不能放,放置 M 的棋子, 每两个棋子不能在同一行或者同一列,问有多少种放法 DFS太慢,用SCR好点点 Python 仅仅有 22 行,事实上能够更短.可是得排 ...