题目链接
http://main.edu.pl/en/archive/oi/19/bon
题目大意
考虑正整数集合,现在有n组人依次来取数,假设第i组来了x人,他们每个取的数一定是x的倍数,并且是还剩下的最小的x个。
正整数中有m个数被标成了幸运数,问有哪些人取到了幸运数。
思路
不要把这个题想复杂了,实际上这个题非常水。。。
记录
last[x]+x=
从小到大第一个没有被用过的
x
的倍数。我们每次开始取
代码非常好写,但是处处有坑,此题如果 last[x] 在某些时候忘记更新的话就会很容易TLE。
代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#define MAXN 2100000
using namespace std;
typedef long long int LL;
bool isLucky[MAXN],used[MAXN];
int last[MAXN],m,n;
LL stack[MAXN],top=0;
int main()
{
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
int x;
scanf("%d",&x);
isLucky[x]=true;
}
LL tot=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
LL x;
scanf("%d",&x);
LL tmp=x;
for(int t=last[x]+x,j=1;j<=x;j++)
{
if(t>1100000) break;
tot++,tmp--;
while(used[t]) t+=x;
used[t]=true;
last[x]=t;
if(isLucky[t])
stack[++top]=tot;
}
tot+=tmp;
}
printf("%lld\n",top);
for(int i=1;i<=top;i++) printf("%lld\n",stack[i]);
return 0;
}