【NOIP提高组模拟A组8.15】膜法师 (Standard IO)
2017-08-15 20:42
471 查看
题目大意:
一个序列A[i],你要把它构成一个B序列,满足length(B)+K>=length(A),a[i]-k<=B[i]<=a[i]让他们有一个公因数G,输出所有的G。50 n<=1000;
90 n<=100000;
100 n<=2000000
思路:
50分暴力就好了,每次枚举一个是是否可以是G的倍数。90和100是同一个算法,但是90是pascal,100是C++(Pascal没人对!!!!)。
思路是可以把它转化成一个区间上的问题,就是问对于枚举的每一个G他的G到G-K,2*G到2*G-K….一直到max(a[i]) div G这里面有多少个数。时间复杂度是(max(a[i])*ln(maxa[i]));一般都是算成(max(a[i])*log(max(a[i])));
这题的结题思路就是转化成区间去思考,不过pascal就很惨了。代码30行左右,真的特别好打
程序:
uses math; const maxn=2000000; var f,a,b:array [-maxn..maxn] of longint; i,j,t,ii,n,m,k,ans,g,cmax:longint; begin readln(t); for ii:=1 to t do begin readln(n,m,k); for i:=1 to n do begin read(a[i]); a[i]:=a[i]-m; inc(b[a[i]]); if a[i]>cmax then cmax:=a[i]; end; for i:=-maxn+1 to maxn do f[i]:=f[i-1]+b[i]; for i:=1 to cmax do begin if i<=m then begin if f[i-m-1]<=k then write(i,' '); continue; end; ans:=f[i]-f[i-m-1]; g:=i; for j:=2 to (cmax div i)+1 do begin ans:=ans+f[j*i]-f[max(j*i-m-1,g)]; g:=g+i; end; if n-ans<=k then write(i,' '); end; writeln; if ii=t then break; fillchar(b,sizeof(b),0); fillchar(f,sizeof(f),0); end; end.
相关文章推荐
- 膜法师【NOIP提高组模拟A组8.15】
- 【JZOJ5280】【NOIP提高组模拟A组8.15】膜法师
- 【jzoj5280】【NOIP提高组模拟A组8.15】【膜法师】
- JZOJ 5305. 【NOIP2017提高A组模拟8.18】C (Standard IO)
- JZOJ 5307. 【NOIP2017提高A组模拟8.18】偷窃 (Standard IO)
- JZOJ5280. 【NOIP提高组模拟A组8.15】膜法师
- JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 4000 (Standard IO)
- 3917 【NOIP2014模拟11.2A组】福慧双修 (Standard IO)题解
- [JZOJ 4699][CF583C]【NOIP2016提高A组模拟8.15】Password
- 【jzoj5279】【NOIP提高组模拟A组8.15】【香港记者】
- 2554. 【NOIP2011模拟9.7】帕秋莉·诺蕾姬 (Standard IO)
- 【NOIP2016提高A组模拟8.15】Garden
- JZOJ8.11(C组)【NOIP2011模拟9.1】方格取数 (Standard IO)
- CQOI2012 BZOJ2669 【NOIP2016提高A组模拟8.15】Garden
- 3076. 【备战NOIP2012图论专项模拟试题】位图 (Standard IO)
- 【NOIP2014模拟9.9】逆光 (Standard IO)
- 3927. 【NOIP2014模拟11.6】可见点数 (Standard IO)
- jzoj3053. 【NOIP2012模拟10.25】旅行 (Standard IO)
- 2555. 【NOIP2011模拟9.7】雾雨魔理沙 (Standard IO)