https://codeforces.com/problemset/problem/1516/D
参考:https://blog.csdn.net/baredman/article/details/116052352
https://codeforces.com/contest/1516/submission/113744317
线段数一般要固定的区间,所以这题只能倍增,存之后2^k有相同因子的坐标。
import java.util.*;
import java.io.*;
public class Main {
public static void main(String args[]) {new Main().run();}
FastReader in = new FastReader();
PrintWriter out = new PrintWriter(System.out);
void run(){
work();
out.flush();
}
long mod=1000000007;
long gcd(long a,long b) {
return a==0?b:gcd(b%a,a);
}
final int inf=Integer.MAX_VALUE/2;
void work() {
int n=ni(),q=ni();
int[] A=nia(n);
int[] rec=new int[100001];
for(int i=0;i<100001;i++){
rec[i]=i;
}
for(int i=2;i*i<=100000;i++){
if(rec[i]==i){
for(int j=i;j*i<=100000;j++){
rec[i*j]=i;
}
}
}
int[][] S=new int[n][20];
int[] count=new int[100001];
for(int i=0,c=0,j=-1;i<n;i++){
if(c==0)j++;
while(j<n&&c==0){
int v=A[j];
while(v!=1){
int b=rec[v];
count[b]++;
if(count[b]==2){
c++;
}
while(v%b==0)v/=b;
}
if(c>0)break;
j++;
}
S[i][0]=Math.min(j,n);
int v=A[i];
while(v!=1){
int b=rec[v];
count[b]--;
if(count[b]==1){
c--;
}
while(v%b==0)v/=b;
}
}
for(int i=n-1;i>=0;i--){
for(int j=1;j<20;j++){
if(S[i][j-1]==n){
S[i][j]=n;
}else{
S[i][j]=S[S[i][j-1]][j-1];
}
}
}
for(;q>0;q--){
int l=ni()-1,r=ni()-1;
int ret=0;
for(int i=19,cur=l;i>=0;i--){
if(S[cur][i]<=r){
ret+=(1<<i);
cur=S[cur][i];
}
}
out.println(ret+1);
}
}
//input
@SuppressWarnings("unused")
private ArrayList<Integer>[] ng(int n, int m) {
ArrayList<Integer>[] graph=(ArrayList<Integer>[])new ArrayList[n];
for(int i=0;i<n;i++) {
graph[i]=new ArrayList<>();
}
for(int i=1;i<=m;i++) {
int s=in.nextInt()-1,e=in.nextInt()-1;
graph[s].add(e);
graph[e].add(s);
}
return graph;
}
private ArrayList<long[]>[] ngw(int n, int m) {
ArrayList<long[]>[] graph=(ArrayList<long[]>[])new ArrayList[n];
for(int i=0;i<n;i++) {
graph[i]=new ArrayList<>();
}
for(int i=1;i<=m;i++) {
long s=in.nextLong()-1,e=in.nextLong()-1,w=in.nextLong();
graph[(int)s].add(new long[] {e,w});
graph[(int)e].add(new long[] {s,w});
}
return graph;
}
private int ni() {
return in.nextInt();
}
private long nl() {
return in.nextLong();
}
private String ns() {
return in.next();
}
private long[] na(int n) {
long[] A=new long[n];
for(int i=0;i<n;i++) {
A[i]=in.nextLong();
}
return A;
}
private int[] nia(int n) {
int[] A=new int[n];
for(int i=0;i<n;i++) {
A[i]=in.nextInt();
}
return A;
}
}
class FastReader
{
BufferedReader br;
StringTokenizer st;
public FastReader()
{
br=new BufferedReader(new InputStreamReader(System.in));
}
public String next()
{
while(st==null || !st.hasMoreElements())//回车,空行情况
{
try {
st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace();
}
}
return st.nextToken();
}
public int nextInt()
{
return Integer.parseInt(next());
}
public long nextLong()
{
return Long.parseLong(next());
}
}