您的位置:首页 > 大数据 > 人工智能

Codeforces Round #209 (Div. 2)-C. Prime Number(set)和D. Pair of Numbers(线段树)

2013-11-03 13:23 477 查看
不停的提取公因式。因为牵扯到0,最后取min(ans,sum)。原来很傻的去人工模拟。
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<set>
using namespace std;
typedef long long int1;
const int1 mod = 1000000007;
int1 a[110000];
int1 gar[110000];
multiset<int1> q;
multiset<int1>::iterator it;
int1 mod_pow(int1 x,int1 n){
int1 res=1;
while(n>0){
if(n&1) res=res*x%mod;
x=x*x%mod;
n>>=1;
}
return res;
}
int main(){
int1 x,n,sum=0,ans;
cin>>n>>x;
for(int1 i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
ans=sum-a
;
for(int1 i=1;i<=n;i++) q.insert(a
-a[i]);
int1 cnt=0;
int1 c=0;
while(1){
cnt=q.count(c);
if(q.count(c)) q.erase(c);
int1 k=cnt/x;
if(cnt%x) break;
if(k) ans++;
c++;
for(int1 i=1;i<=k;i++)
q.insert(c);
if(q.empty()) break;
}
cout<<mod_pow(x,min(ans,sum))<<endl;
return 0;
}

这题我用线段树写,1803ms..因为不会用rmq求区间的gcd
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
int gcd(int a,int b){
return a==0?b:gcd(b%a,a);
}
int n,A[320000],g[4*320000];
int d[320000][120];
set<int> ans[320000];
void up(int o){
g[o]=gcd(g[o<<1],g[o<<1|1]);
}
void build(int l,int r,int o){
if(l==r){
g[o]=A[l];
return ;
}
int m=(l+r)>>1;
build(l,m,o<<1);
build(m+1,r,o<<1|1);
up(o);
}
int ql,qr;
int query(int o,int l,int r){
int m=(l+r)/2,ans1=-1,ans2=-1;
if(ql<=l&&r<=qr) return g[o];
if(ql<=m) ans1=query(o<<1,l,m);
if(m<qr) ans2=query(o<<1|1,m+1,r);
if(ans1==-1) return ans2;
if(ans2==-1) return ans1;
return gcd(ans1,ans2);
}
int RMQ_init(){
for(int i=1;i<=n;i++) d[i][0]=A[i];
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i+(1<<(j-1))<=n;i++)
d[i][j]=min(d[i][j-1],d[i+(1<<(j-1))][j-1]);
}
int RMQ(int L,int R){
int k=0;
while(1<<(k+1) <= R-L+1) k++;
return min(d[L][k],d[R-(1<<k)+1][k]);
}
bool ok(int len){
bool flag=false;
for(int i=1;i+len-1<=n;i++){
int x=RMQ(i,i+len-1);
ql=i;qr=i+len-1;
int y=query(1,1,n);
if(x==y){
flag=true;
ans[len].insert(i);
}
}
return flag;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&A[i]);
RMQ_init();
build(1,n,1);
int l=0,r=n,m;
while(r-l>0){
m=(l+r+1)/2;
if(ok(m)) l=m;
else r=m-1;
}
m=l;
int sz=ans[m].size();
printf("%d %d\n",sz,m-1);
set<int>::iterator it;
it=ans[m].begin();
printf("%d",*it);
it++;
for(;it!=ans[m].end();it++)
printf(" %d",*it);
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codeforces