Description
在你的帮助下,膜法师们成功地续走了香港记者。
有 n 个膜法师各有 ai 的时间能续给长者,但是 n 个膜法师一起续命要考虑效率问题,他们要选出一个数 g 使得每个膜法师续给长者的时间是 g 的倍数,膜法师们有一个能力值 k,每个膜法师能偷偷将不超过 k 的时间偷偷直接续给长者,来使膜法阵发挥更大的威力。由于膜法阵有一定容错性,能有 f 个膜法师不符合续给长者的时间是 g 的倍数这个要求。
一句话题意:有 n 个数构成的数列 A 元素为 ai,你要构造一个数列 B 元素为 bi 使得满足bi > 0; ai - k ≤ bi ≤ ai 使得去除 f 个元素后 bi 的有公约数 g。一个测试点有多组测试数据,当一个测试点的所有测试数据都与标准答案相同时,该测试点得分。
Input
输入文件名为 mogician.in。
第一行,一个整数 T,表示数据组数。
对于下面的每一组数据:
第一行,三个整数 n, k, f 表示膜法师数量,能力值和容错值。
第二行, n 个整数 ai,依次表示每个膜法师的时间。
Output
输出文件名为 mogician.out。
T 行,每行升序输出满足题意的所有整数 g。
Sample Input
1
6 3 1
78 69 55 102 233 666
Sample Output
1 2 3 4 5 6 11
Hint
题解
1 #include<set> 2 #include<map> 3 #include<cmath> 4 #include<ctime> 5 #include<queue> 6 #include<stack> 7 #include<vector> 8 #include<cstdio> 9 #include<string> 10 #include<cstdlib> 11 #include<cstring> 12 #include<iostream> 13 #include<algorithm> 14 #define LL long long 15 #define RE register 16 #define IL inline 17 using namespace std; 18 const int N=2e6; 19 const int INF=~0u>>1; 20 21 IL int Read() 22 { 23 int sum=0; 24 char c=getchar(); 25 while (c<'0'||c>'9') c=getchar(); 26 while (c>='0'&&c<='9') sum=sum*10+c-'0',c=getchar(); 27 return sum; 28 } 29 IL void put(int d) 30 { 31 if (!d) return; 32 put(d/10); 33 putchar(d%10+'0'); 34 } 35 36 IL int Min(const int &a,const int &b) {return a<b ? a:b;} 37 IL int Max(const int &a,const int &b) {return a>b ? a:b;} 38 39 int t,n,k,f,maxn; 40 int a[N+5]; 41 int s[N+5]; 42 43 int main() 44 { 45 t=Read(); 46 while (t--) 47 { 48 n=Read();k=Read();f=Read(); 49 maxn=0; 50 memset(s,0,sizeof(s)); 51 for (RE int i=1;i<=n;i++) a[i]=Read(),maxn=Max(maxn,a[i]),s[a[i]]++; 52 for (RE int i=1;i<=maxn;i++) s[i]+=s[i-1]; 53 for(RE int d=1;d<=maxn;d++) 54 { 55 int cnt=s[d-1]; 56 for(RE int j=d;cnt<=f&&j+k+1<=maxn;j+=d) 57 if (j+k<Min(maxn,j+d-1)) cnt+=s[Min(maxn,j+d-1)]-s[j+k]; 58 if (cnt<=f) put(d),putchar(' '); 59 } 60 putchar('\n'); 61 } 62 return 0; 63 }