Codeforces 691F Couple Cover
2016-07-26 09:43
375 查看
可以暴力预处理出每一种小于3000000的乘积有几种。询问的时候可以用总的方案减去比p小的有几种o(1)输出。
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<iostream> using namespace std; typedef long long LL; const double pi = acos(-1.0), eps = 1e-8; void File() { freopen("D:\\in.txt", "r", stdin); freopen("D:\\out.txt", "w", stdout); } inline int read() { char c = getchar(); while (!isdigit(c)) c = getchar(); int x = 0; while (isdigit(c)) { x = x * 10 + c - '0'; c = getchar(); } return x; } const int maxn=1000000+10; int n,q; LL a[maxn],c[3*maxn],f[3*maxn]; void init() { for(LL i=1;i<=3000000;i++) { if(c[i]==0) continue; for(LL j=1;j<=i;j++) { if(c[j]==0) continue; if(i*j>3000000) break; if(i==j) f[i*j]=f[i*j]+c[i]*(c[j]-1); else f[i*j]=f[i*j]+2*c[i]*c[j]; } } for(int i=2;i<=3000000;i++) f[i]=f[i]+f[i-1]; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); c[a[i]]++; } init(); scanf("%d",&q); for(int i=1;i<=q;i++) { LL p; scanf("%lld",&p); printf("%lld\n",(LL)n*(n-1)-f[p-1]); } return 0; }
相关文章推荐
- asp.net实现上传图片时判断图片的模式GRB或CMYK的方法
- 4G_1
- Html5 拖放(drag 和 drop)
- Linux sed命令详解
- OpenCV两种方式创建图像序列文件xml,yml,yaml等
- Single Number
- php 读取输出其他文件的实现方法
- 统计exchange 数据库内邮箱数量
- iOS 中的@2x 和@3x 图片处理问题
- 练习题 旅行(重庆一中高2018级信息学竞赛测验4) 解题报告
- 空格
- 网络带宽查看并找出占用大的进程
- Oracle表空间和数据文件
- 单元素的枚举类型已经成为实现Singleton的最佳方法
- R连接mysql数据库基本步骤
- C语言中变量的存储类别及其存储方式
- 如何合理优化WEB前端 高效提升WEB前端性能
- make[1]: *** [/workopenwrt/trunk/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/stamp/.tools_install_nnnnn] Error 2 make[1]: Leaving directory `/work/openwrt/trunk' make: *** [world]
- android MVVM开发模式(三)
- 英文催稿信