题目描述

考虑正整数集合,现在有n组人依次来取数,假设第i组来了x人,他们每个取的数一定是x的倍数,并且是还剩下的最小的x个。
正整数中有m个数被标成了幸运数,问有哪些人取到了幸运数。

输入

第一行一个正整数m (m<=1,000,000),下面m行每行一个正整数x (x<=1,000,000),表示x是一个幸运数。
接下来一行一个正整数n (n<=1,000,000),下面n行每行一个正整数x (x<=1,000,000),表示这一组来了x个人。

输出

第一行输出一个非负整数k,表示k个人取到了幸运数,下面k行依次表示取到幸运数的人的编号,人按照来的顺序从1开始编号。

样例输入

4
1
6
8
16
3
4
2
4

样例输出

3
2
4
6


题解

暴力

考虑:取的数超过了最大的幸运数便没有了意义,因此当某次取的数超过最大幸运数时直接停止取数即可。

于是可以对于每个x,维护pos[x],表示x人组下一次应该取的位置。这些位置以前的一定是取过的,因此下一次直接从该位置向后判断即可。

然后只需要维护一个数是否使用过即可。

时间复杂度为某调和级数的$O(n\ln n)$

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1000010
using namespace std;
int tag[N] , vis[N] , pos[N] , tot;
long long sta[N];
int main()
{
int n = 0 , m , k , i , x;
long long now = 0;
scanf("%d" , &m);
for(i = 1 ; i <= m ; i ++ ) scanf("%d" , &x) , tag[x] = 1 , n = max(n , x);
for(i = 1 ; i <= n ; i ++ ) pos[i] = i;
scanf("%d" , &k);
while(k -- )
{
scanf("%d" , &x);
for(i = 1 ; i <= x ; i ++ )
{
while(pos[x] <= n && vis[pos[x]]) pos[x] += x;
if(pos[x] > n) break;
if(tag[pos[x]]) sta[++tot] = now + i;
vis[pos[x]] = 1;
}
now += x;
}
printf("%d\n" , tot);
for(i = 1 ; i <= tot ; i ++ ) printf("%lld\n" , sta[i]);
return 0;
}

最新文章

  1. [MySQL Reference Manual] 23 Performance Schema结构
  2. jquery阻止冒泡事件行为发生
  3. 洛谷 P1007 独木桥
  4. 16.2.2 Space Needed for keys
  5. android5.0 aosp编译记录(由于机器硬件原因,改为4.4.2编译通过)
  6. JAVA设计模式——单例模式
  7. 终于解决SQL Server 2008 64位系统无法导入Access/Excel的问题 2012/08/01
  8. scribe、chukwa、kafka、flume日志系统对比 -摘自网络
  9. C++: std::string 与 Unicode 如何结合?
  10. spring:ContextLoaderListener接口
  11. 使用TWebBrowser组件保存网页为html和mht文件 收藏
  12. linux服务之NFS和SAMBA服务
  13. Csharp调用基于Opencv编写的类库文件
  14. JVM调优入门之初探
  15. C# 设置Excel超链接(一)
  16. [转] 指定进程运行的CPU
  17. OpenCV-Python入门教程3-图像基本操作(访问像素点/ROI/通道分离)
  18. PHP导出CVS格式文件
  19. 【随笔】借鉴 &amp; KPI式设计
  20. PAT 1011 World Cup Betting

热门文章

  1. 面试-Spring理解
  2. vue项目中的函数封装
  3. MySQL - Mac下安装MySQL
  4. linux 安装 zookeeper
  5. python--Wrapper
  6. PHP脚本执行效率性能检测之WebGrind的使用
  7. 【JavaScript】jQuery绑定事件
  8. Facebook Reporting API -- Facebook 数据导出API
  9. Python全栈day 03
  10. P1338 末日的传说 逆序数对