Codeforces Round #209 (Div. 2)-C. Prime Number(set)和D. Pair of Numbers(线段树)
2013-11-03 13:23
477 查看
不停的提取公因式。因为牵扯到0,最后取min(ans,sum)。原来很傻的去人工模拟。
这题我用线段树写,1803ms..因为不会用rmq求区间的gcd
#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 Round #209 (Div. 2) D. Pair of Numbers
- Codeforces Round #209 (Div. 2) D. Pair of Numbers
- Codeforces 209 div2 D. Pair of Numbers
- Codeforces Round #209 (Div. 2) D - Pair of Numbers
- Codeforces Round #209 (Div. 2) D.Pair of Numbers
- Codeforces Round #209 (Div. 2) D. Pair of Numbers (模拟)
- Codeforces Round #209 (Div. 2), problem: (D) Pair of Numbers
- Codeforces Round #209 (Div. 2) D. Pair of Numbers
- Codeforces Round #310 (Div. 2) B. Case of Fake Numbers 水题
- CF359D:Pair of Numbers(数论)
- CodeForces 3107 ODDDIV - Odd Numbers of Divisors(数论)
- CF359D:Pair of Numbers(数论)
- 【前缀和】【枚举倍数】 Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) D. Arpa and a list of numbers
- #CF 359 D Pair of Numbers(dp)
- cf D. Pair of Numbers
- Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) F. Souvenirs 线段树套set
- CF359D:Pair of Numbers(数论)
- Spoj-ODDDIV Odd Numbers of Divisors
- Project Euler 44: Find the smallest pair of pentagonal numbers whose sum and difference is pentagonal.
- Codeforces Codeforces Round #432 (Div. 2 D ) Arpa and a list of numbers