Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 681    Accepted Submission(s): 240


Problem Description
This is a simple problem. The teacher gives Bob a list of problems about GCD (Greatest Common Divisor). After studying some of them, Bob thinks that GCD is so interesting. One day, he comes up with a new problem about GCD. Easy as it looks, Bob cannot figure it out himself. Now he turns to you for help, and here is the problem:
  
  Given an array ].
  
 

 

Input
There are several tests, process till the end of input.
  
  For each test, the first line consists of two integers 1000000
 

 

Output
For each query, output the answer in one line.
 

 

Sample Input
5 3
1 3 4 6 9
3 5
2 5
1 5
 

 

Sample Output
6
6
6
 

 

Source
 

 题意:

 题解:

 1 /******************************
 2 code by drizzle
 3 blog: www.cnblogs.com/hsd-/
 4 ^ ^    ^ ^
 5  O      O
 6 ******************************/
 7 #include<bits/stdc++.h>
 8 #include<iostream>
 9 #include<cstring>
10 #include<cstdio>
11 #include<map>
12 #include<algorithm>
13 #include<queue>
14 #define LL __int64
15 #define pii pair<int,int>
16 #define MP make_pair
17 const int N=1000006;
18 using namespace std;
19 int gcd(int a,int b)
20 {
21     return b==0 ? a : gcd(b,a%b);
22 }
23 int n,q,a[N],ans[N];
24 vector<pii> G[N];
25 struct QQ{
26   int l,r,id;
27   bool operator < (const QQ &a) const
28   {
29        return a.r>r;
30   }
31 }Q[N];
32 int C[N],vis[N];
33 void update (int x,int c)
34 {
35     for(int i=x;i<N;i+=i&(-i)) C[i]+=c;
36 }
37 int ask(int x)
38 {
39     int s=0;
40     for(int i=x;i;i-=i&(-i)) s+=C[i];
41     return s;
42 }
43 int main()
44 {
45     while(scanf("%d %d",&n,&q)!=EOF)
46     {
47         for(int i=1;i<=n;i++)
48             scanf("%d",&a[i]);
49         for(int i=0;i<=n;i++)
50             G[i].clear();
51         for(int i=1;i<=n;i++)
52         {
53             int x=a[i];
54             int y=i;
55             for(int j=0;j<G[i-1].size();j++)
56             {
57                 int res=gcd(x,G[i-1][j].first);
58                 if(x!=res)
59                 {
60                     G[i].push_back(MP(x,y));
61                     x=res;
62                     y=G[i-1][j].second;
63                 }
64             }
65             G[i].push_back(MP(x,y));
66         }
67         memset(C,0,sizeof(C));
68         memset(vis,0,sizeof(vis));
69         for(int i=1;i<=q;i++)
70         {
71             scanf("%d %d",&Q[i].l,&Q[i].r);
72             Q[i].id=i;
73         }
74         sort(Q+1,Q+q+1);
75         for(int R=0,i=1;i<=q;i++)
76         {
77             while(R<Q[i].r)
78             {
79                 R++;
80             for(int j=0;j<G[R].size();j++)
81             {
82                 int res=G[R][j].first;
83                 int ids=G[R][j].second;
84                 if(vis[res])
85                     update(vis[res],-1);
86                 vis[res]=ids;
87                 update(vis[res],1);
88             }
89             }
90             ans[Q[i].id]=ask(R)-ask(Q[i].l-1);
91         }
92         for(int i=1;i<=q;i++)
93             cout<<ans[i]<<endl;
94     }
95     return 0;
96 }

 

相关文章: