您的位置:首页 > 其它

HDU 5726 区间GCD=k的个数

2017-03-18 09:31 363 查看
不知为何改了了ll就过了 感觉Int应该不会有问题才对

做了两道区间GCD的 也算有点收获#include <bits/stdc++.h>
#define N 101000
#define FREI freopen("in.txt","r",stdin)
#define FREO freopen("out.txt","w",stdout)
#define Mem(a,b) memset(a,b,sizeof(a))
#define lson root<<1
#define rson root<<1|1
#define Mid int mid=(l+r)>>1
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
typedef pair<ll,ll> Pair;
int n,m;
ll a
;
map<ll,ll> f;
vector<Pair> v
;
ll GCD[N<<2];

void build(int root,int l,int r){
if(l==r){
GCD[root]=a[l];
return ;
}
Mid;
build(lson,l,mid);
build(rson,mid+1,r);
GCD[root]=__gcd(GCD[lson],GCD[rson]);
}
ll query(int root,int l,int r,int ql,int qr) {
ll res=0;
if(l>qr||r<ql)
return 0;
if(l>=ql&&r<=qr) {
return GCD[root];
}
Mid;
res=__gcd(res,query(lson,l,mid,ql,qr));
res=__gcd(res,query(rson,mid+1,r,ql,qr));
return res;
}
inline void yingshe(ll tmp) {
if(!f.count(tmp)) {
f[tmp]=0;
}
}
inline void Count(ll tmp,ll num){
f[tmp]+=num;
}
int main() {
#ifndef ONLINE_JUDGE
FREI;
//FREO;
#endif // ONLINE_JUDGE
int t;
scanf("%d",&t);
for(int cas=1;cas<=t;cas++) {
scanf("%d",&n);
f.clear();
for(int i=1; i<=n; i++) {
scanf("%lld",&a[i]);
v[i].clear();
}
build(1,1,n);
for(int i=1; i<=n; i++) {
v[i].push_back(make_pair(a[i],i));
ll tmp=a[i],r=i;
yingshe(tmp);
for(int j=0; j<v[i-1].size(); j++) {
ll gcd=__gcd(tmp,v[i-1][j].first);
if(gcd!=tmp) {
yingshe(gcd);
Count(tmp,r-v[i-1][j].second);
v[i].push_back(make_pair(gcd,v[i-1][j].second));
tmp=gcd;
r=v[i-1][j].second;
}
}
Count(tmp,r);
}
scanf("%d",&m);
printf("Case #%d:\n",cas);
for(int i=1;i<=m;i++){
int l,r;
scanf("%d%d",&l,&r);
ll ans=query(1,1,n,l,r);
printf("%lld %lld\n",ans,f[ans]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: