题目链接:http://codeforces.com/problemset/problem/691/F

题目大意:给定n个数,再给m个询问,每个询问给一个p,求n个数中有多少对数的乘积≥p

数据范围:2≤n≤10^6, 1≤ai≤3*10^6,1≤m≤10^6, 1≤p≤3*10^6

解题思路:比赛的时候比较naive的思路是把n中的数字排序去了重之后,对于每个p,最多枚举√p步,就能得到答案。而这个naive的思路是O(p√p)的,结果T了。

后来百思不得其解,去看了官方的解答。感觉是一种很有必要总结的思路。思路的模型是埃氏筛素数。

筛素数中枚举到一个素数pr,我们就把MAX范围内的pr的倍数依次搭上标记。这样做看似暴力,实际上复杂度近乎O(n)(其实是O(MAX/p1+MAX/p2..MAX/pk))

回到这道题目,完全可以借鉴上述思路,从1-MAX枚举a,再从1-MAX/a枚举另一半b,记n个数中乘积等于i的对数ans[i],那么就有ans[a*b] += cnt[a]*cnt[b];其中cnt[i]表示n个数中i这个数出现了多少次。仔细分析复杂度的话是O(MAX/1+MAX/2+MAX/3+...+MAX/MAX),事实上,这个东西是接近O(MAXlogMAX)的,这种思想在处理一些数论问题中同样很有借鉴意义。我认为这种思路复杂度的支撑点在于他有一个上限MAX,并且内部的操作是相乘。

最后得到了ans[i]之后取个前缀和就得到了n个数中乘积<p的对数,用总对数一减就得到了答案。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;const int MaxN = 3e6;
int n, m, MaX;
int a[MaxN + 5], p[MaxN + 5];
LL cnt[MaxN + 5], sum[MaxN + 5];int main()
{while (~scanf("%d", &n)) {memset(cnt, 0, sizeof(cnt));memset(sum, 0, sizeof(sum));for (int i = 1; i <= n; i++) scanf("%d", &a[i]), cnt[a[i]]++;scanf("%d", &m); MaX = -(1 << 30);for (int i = 1; i <= m; i++) scanf("%d", &p[i]), MaX = max(MaX, p[i]);for (int i = 1; i <= MaX; i++)for (int j = 1; i * j <= MaX; j++)if (i != j) sum[i * j] += cnt[i] * cnt[j];else sum[i * j] += cnt[i] * cnt[i] - cnt[i];for (int i = 1; i <= MaX; i++) sum[i] += sum[i - 1];for (int i = 1; i <= m; i++) printf("%I64d\n", (LL)n * (n - 1) - sum[p[i] - 1]);}
}

View Code

转载于:https://www.cnblogs.com/ChopsticksAN/p/5727819.html

Educational Codeforces Round 14 - F (codeforces 691F)相关推荐

  1. Codeforces Global Round 14 F. Phoenix and Earthquake 思维 + 并查集

    传送门 文章目录 题意: 思路: 题意: 给你nnn个点,mmm条边,限制xxx,每个点都有沥青aia_iai​,定义合并两个点即两点之间有边且au+av≥xa_u+a_v\ge xau​+av​≥x ...

  2. Educational Codeforces Round 9 F. Magic Matrix 最小生成树

    F. Magic Matrix 题目连接: http://www.codeforces.com/contest/632/problem/F Description You're given a mat ...

  3. Educational Codeforces Round 39 F Largest Beautiful Number

    传送门 暴力DP dp[i][j][k] 从j 到 k 发f(x) 的大小, #include <bits/stdc++.h> using namespace std; typedef l ...

  4. 双联通分量求简单环(Educational Codeforces Round 42: F. Simple Cycles Edges)

    题意: n个点m条边的无向图,问有哪些边在一个简单环上,按顺序输出这些边的编号 思路: 对于无向图求出每个双联通分量,对于每个双联通分量,如果点的个数==边的个数,那么这个双联通分量就是个简单环,输出 ...

  5. Educational Codeforces Round 51: F. The Shortest Statement(最短路+LCA)

    F. The Shortest Statement 题意: n个点m条边(m≤n+20)的无向连通图,Q次询问,每次求出给定两点的最短路 思路: 将题意转换一下,给你一棵n个节点的树,并且这个树上还有 ...

  6. Educational Codeforces Round 50: F. Relatively Prime Powers(莫比乌斯函数)

    F. Relatively Prime Powers 题意: 给你一个n,问满足在[2,n]范围内有多少个数是非次方数(也就是不是这样的) 思路: 答案就是 原理是利用容斥,注意n开i次根是向下取整( ...

  7. Codeforces Round #775 - F. Serious Business

    F. Serious Business prob. :有3×n3\times n3×n个格子,每个格子有一个权值,你要从左上走到右下,每一步只能往右或往下走,刚开始的时候第二行是封锁的状态,你有一些可 ...

  8. 【Codeforces Round #172】Codeforces 280D k-Maximum Subsequence Sum

    用线段树维护,每次取出最大子段和并把这一段区间取反,重复kk次.复杂度O(mklogn)O(mk\log n). 有一个比较巧妙的证明,按照区间选择的模型建最大费用流,每次增广最长路就是选择最大的区间 ...

  9. Codeforces Round #736 (Div. 1Div2)

    Codeforces Round #736 (Div2) Codeforces Round #736 (Div. 1) 题号 题目 难度 A Gregor and Cryptography 签到 B ...

最新文章

  1. down redis集群_硬核干货!Redis 分布式集群部署实战
  2. 记录一个Ubuntu的一个官方地址
  3. Centos7设置IP为固定值
  4. 027_html框架
  5. C++如何限制对象在堆上或栈上生成
  6. 新疆大学OJ(ACM) 1047: string 字符串排序
  7. GD32 使用stm32 固件库
  8. Win7中多账户设置自动登录的图文方法
  9. 【python】sys.stdout输出不换行
  10. uniapp监听PDA激光扫描
  11. win10 共享打印机错误0x00000709修复
  12. 元宵节动画贺卡制作_2017鸡年元宵节flash电子贺卡模板下载-2017元宵节电子贺卡flash动画模板完整打包下载-东坡下载...
  13. 服务器无线桥接怎么设置,路由器怎么设置桥接方法 2个路由器无线桥接设置图解...
  14. DC-DC15-150V降压5V0.8A 替代PN6005、PN6006电源驱IC
  15. gif动图可以压缩大小吗?gif图片怎么压缩?
  16. 图像处理中 光场(Light Field)简介及理解
  17. A*寻路算法讲解+源码DEMO演示
  18. 华为P20 如时升Android 9.0,冬日如何保持好身材?升级EMUI9.0的华为P20系列有妙招...
  19. 用java代码取网名_【源码教程】iapp获取QQ昵称
  20. Excel库存表通过吉度盘点机盘点形成差异报表

热门文章

  1. python绝对值函数偏码_绝对值python
  2. usb管控软件_数据防泄密软件介绍
  3. 购书中心管理信息系统(含源文件)
  4. eclipse maven打包_maven的通俗易懂的用法
  5. canvas笔记-lineJoin和miterLimit的使用
  6. Spring Cloud笔记-Maven构建父子项目
  7. QML文档阅读笔记-easing.type解析与实例
  8. C/C++获取CPU相关信息(非WMI)
  9. mysql导入_导出命令_MySQL导入导出命令
  10. c++ ffmpeg内存推流_最简单的基于FFmpeg的AVfilter的例子