HDU - 5726 GCD 数学 + 思维
2017-09-19 00:22
423 查看
传送门:HDU 5726
题意:给定一段长度为n的序列和m个询问,每次询问l,r区间的gcd是多少,和区间l,r的gcd相同的区间有多少个。
思路:HDU5869简化版,详见 点击打开链接
代码:
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define MAXN 100010
#define inf 0x3f3f3f3f
using namespace std;
typedef pair<int,int>P;
map<int, ll> cnt;
int val[MAXN];
vector<P> p[MAXN];
int main()
{
int T, n, sz, top, q;
int l, r, tmp, ans, kase = 1;
cin >> T;
while(T--)
{
cnt.clear();
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", val + i), p[i].clear();
for(int i = 1; i <= n; i++)
{
cnt[val[i]]++;
p[i].pb(P(val[i], i));
sz = p[i - 1].size();
top = 0;
for(int j = 0; j < sz; j++)
{
tmp = __gcd(val[i], p[i - 1][j].first);
cnt[tmp] += p[i][top].second - p[i - 1][j].second;
if(tmp == p[i][top].first)
p[i][top].second = p[i - 1][j].second;
else
p[i].pb(P(tmp, p[i - 1][j].second)), top++;
}
}
scanf("%d", &q);
printf("Case #%d:\n", kase++);
while(q--)
{
scanf("%d %d", &l, &r);
sz = p[r].size();
if(p[r][0].second <= l)
ans = p[r][0].first;
else
for(int i = 1; i < sz; i++)
if(p[r][i - 1].second > l && l >= p[r][i].second)
{
ans = p[r][i].first; break;
}
printf("%d %lld\n", ans, cnt[ans]);
}
}
return 0;
}
题意:给定一段长度为n的序列和m个询问,每次询问l,r区间的gcd是多少,和区间l,r的gcd相同的区间有多少个。
思路:HDU5869简化版,详见 点击打开链接
代码:
#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define MAXN 100010
#define inf 0x3f3f3f3f
using namespace std;
typedef pair<int,int>P;
map<int, ll> cnt;
int val[MAXN];
vector<P> p[MAXN];
int main()
{
int T, n, sz, top, q;
int l, r, tmp, ans, kase = 1;
cin >> T;
while(T--)
{
cnt.clear();
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", val + i), p[i].clear();
for(int i = 1; i <= n; i++)
{
cnt[val[i]]++;
p[i].pb(P(val[i], i));
sz = p[i - 1].size();
top = 0;
for(int j = 0; j < sz; j++)
{
tmp = __gcd(val[i], p[i - 1][j].first);
cnt[tmp] += p[i][top].second - p[i - 1][j].second;
if(tmp == p[i][top].first)
p[i][top].second = p[i - 1][j].second;
else
p[i].pb(P(tmp, p[i - 1][j].second)), top++;
}
}
scanf("%d", &q);
printf("Case #%d:\n", kase++);
while(q--)
{
scanf("%d %d", &l, &r);
sz = p[r].size();
if(p[r][0].second <= l)
ans = p[r][0].first;
else
for(int i = 1; i < sz; i++)
if(p[r][i - 1].second > l && l >= p[r][i].second)
{
ans = p[r][i].first; break;
}
printf("%d %lld\n", ans, cnt[ans]);
}
}
return 0;
}
相关文章推荐
- Hdu 5726 GCD【思维+二分+区间Gcd】好题!
- (HDU 5726)2016 Multi-University Training Contest 1 GCD(数学)
- hdu-5726 GCD 思维||二分
- 数学训练----数论HDU 2588 - GCD
- HDU 5726 GCD(RMQ+二分)
- HDU 5726 GCD
- HDU 2674 N!Again(数学思维水题)
- HDU 5726 GCD
- HDU 5726 GCD(枚举暴力)
- hdu-5651 xiaoxin juju needs help(数学+gcd约分求阶乘)
- hdu 4497 GCD and LCM 数学
- hdu 5726 (线段树 GCD RMQ)多校第一场1004
- hdu_5726_GCD(线段树维护区间+预处理)
- 【HDU 5726】GCD(映射+RMQ)
- N对数的排列问题 HDU-2554 【数学思维 找等式】
- RMQ+二分——GCD ( HDU 5726 ) ( 2016 Multi-University Training Contest 1 1004 )
- HDU 5726 GCD
- HDU 5726 GCD (rmq+二分 or 线段树 维护区间gcd)
- hdu_5726_GCD(线段树维护区间+预处理)
- hdu 1695 GCD(组合数学:容斥原理)