HDU 5726-GCD(暴力+map)
GCD
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2527 Accepted Submission(s): 892
Problem Description
Give you a sequence of N(N≤100,000) integers
: a1,...,an(0<ai≤1000,000,000).
There are Q(Q≤100,000) queries.
For each query l,r you
have to calculate gcd(al,,al+1,...,ar) and
count the number of pairs(l′,r′)(1≤l<r≤N)such
that gcd(al′,al′+1,...,ar′) equal gcd(al,al+1,...,ar).
Input
The first line of input contains a number T,
which stands for the number of test cases you need to solve.
The first line of each case contains a number N, denoting the number of integers.
The second line contains N integers, a1,...,an(0<ai≤1000,000,000).
The third line contains a number Q, denoting the number of queries.
For the next Q lines, i-th line contains two number , stand for the li,ri, stand for the i-th queries.
The first line of each case contains a number N, denoting the number of integers.
The second line contains N integers, a1,...,an(0<ai≤1000,000,000).
The third line contains a number Q, denoting the number of queries.
For the next Q lines, i-th line contains two number , stand for the li,ri, stand for the i-th queries.
Output
For each case, you need to output “Case #:t” at the beginning.(with quotes, t means
the number of the test case, begin from 1).
For each query, you need to output the two numbers in a line. The first number stands for gcd(al,al+1,...,ar) and the second number stands for the number of pairs(l′,r′) such that gcd(al′,al′+1,...,ar′) equal gcd(al,al+1,...,ar).
For each query, you need to output the two numbers in a line. The first number stands for gcd(al,al+1,...,ar) and the second number stands for the number of pairs(l′,r′) such that gcd(al′,al′+1,...,ar′) equal gcd(al,al+1,...,ar).
Sample Input
1
5
1 2 4 6 7
4
1 5
2 4
3 4
4 4
Sample Output
Case #1:
1 8
2 4
2 4
6 1
Author
HIT
Source
Recommend
題目意思:
有一串N個數字,Q個查詢給出一組區間,求區間內各個數的GCD以及共有多少個區間的書的GCD與給定區間的GCD相同。
解題思路:
下面的程式碼是標程,根據題解說說自己的理解。
每輸入一個數a[i]就進行一次處理:依次計算以a為結尾的子序列的GCD,就是說a所在的位置是區間的最右端點,
定義vector<pair<int,int> > g[maxn];其中first:gcd;second:區間左端點。
即first=GCD(a[second],a[i]),g[i][j]中i表示輸入的第i個數,j表示當前處理第i個數時儲存的第j組不同GCD。
定義map<ll,ll>m;m[i]=j,表示GCD為i的區間共有j個。
所以儲存記錄map的時候,m[g[i][j].first]+=(j==g[i].size()-1?i+1:g[i][j+1].second)-g[i][j].second;
對單個的a[i]GCD為本身進行了特判,其它的就是利用下一個的區間左端減去當前區間左端的差值作為當前新增的GCD個數。
掃map之前找GCD的查詢的時,固定右端點,查詢左端點。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <map>
#include <vector>
#include <cstdlib>
#define maxn 100010
#define ll long long
using namespace std;
map<ll,ll>m;
vector<pair<int,int> > g[maxn];//first:gcd;second:區間左端點
int gcd(int a,int b)//求ab兩數的最大公約數
{
return b?gcd(b,a%b):a;
}
ll a[maxn];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t,ca=0;
cin>>t;
while(t--)
{
m.clear();
cout<<"Case #"<<++ca<<":"<<endl;
int n,q,l,r,i,j;
cin>>n;
for(int i=0; i<=n; ++i)
g[i].clear();//不清空會超記憶體
//預處理出所有的以L開頭的左區間的gcd(al,al+1,...,ar):
//對於每個數字,記錄從開始到當前數字的區間的子區間中以當前數字為結尾區間的gcd
//相同gcd區間合併
for(i=1; i<=n; ++i)
{
int last=0;
cin>>a[i];
for(j=0; j<g[i-1].size(); ++j)
{
int tmp=gcd(a[i],g[i-1][j].first);
if(tmp==last) continue;//上一個出現過該gcd
last=tmp;
g[i].push_back(make_pair(tmp,g[i-1][j].second));
}
if(last!=a[i])//當前a與自己的gcd在上面的迴圈中沒有出現過
g[i].push_back(make_pair(a[i],i));
//用一個map來記錄,gcd值為key的有多少個
for(j=0; j<g[i].size(); ++j)
{
m[g[i][j].first]+=(j==g[i].size()-1?i+1:g[i][j+1].second)-g[i][j].second;
// cout<<g[i][j].first<<" "<<m[g[i][j].first]<<endl;
}
}
cin>>q;
for(i=0; i<q; ++i)
{
cin>>l>>r;
for(j=0; j<g[r].size(); ++j)//對於每個詢問只需要查詢對應gcd(al,al+1,...,ar)為多少
if(g[r][j].second>l) break;
cout<<g[r][j-1].first<<" "<<m[g[r][j-1].first]<<endl;
}
}
return 0;
}
/**
1
5
1 2 4 6 7
4
1 5
2 4
3 4
4 4
**/
相關文章
- HDU 5536 Chip Factory (暴力 或者 01Trie)
- HDU 4460 Friend Chains(map + spfa)AI
- HDU4941Magical Forest(map)REST
- HDU 5113 Black And White(暴力dfs+減枝)
- HDU-3172 Virtual Friends 並查集+map並查集
- YT14-HDU-求N^N的個位數(暴力破解版)
- HDU 1258Sum It Up(暴力dfs,記住相同的狀態只保留一個)
- hdu 4821 ||2013年長春站J題 字串雜湊+map的應用字串
- 暴力破解
- api暴力獲取API
- C++暴力指南C++
- 南洋理工:研究發現暴力遊戲與暴力行為無關遊戲
- 什麼是暴力破解?暴力破解的方法有哪些?
- Map
- Java 中的map - The Map Interface.Java
- 暴力破解測試
- kali暴力破解教程
- [暴力 Trick] 根號分治
- SG 函式初步 HDU 1536 && HDU 1944函式
- hdu5532
- Shape of HDU
- HDU4787
- JavaScript map()JavaScript
- jQuery map()jQuery
- Google MapGo
- java mapJava
- Map集合
- 快手嚴打網路暴力:整治網路暴力不能一刀切
- c++ map和unordered_map比較C++
- java Map及Map.Entry詳解Java
- 迭代暴力破解域名工具
- Blue Jeans 【KMP+暴力】KMP
- .net下程式的暴力修改
- 24點 Pascal大暴力程式
- 分塊——優雅的暴力
- 遭受網路暴力該如何應對?實名制可有效遏制網路暴力
- HDU 2052(C語言+註釋)+HDU 2090C語言
- java中Map根據Map的value取keyJava