筛选法的应用
发布日期:2021-06-29 11:10:37
浏览次数:2
分类:技术文章
本文共 891 字,大约阅读时间需要 2 分钟。
回忆一下素数筛选法;
先标记;假设都是素数; 然后从2开始把2的倍数变量一遍并且可以标记为非素数; 最后剩下的都是素数了; 这就是简单的素数的筛选法;接下来看这道筛选法的应用; 题目大意很容易理解;就是求两者取摸不等于0且前者要大于后者;用筛素数法的筛选法求出对于每个a[j]的a[i] % a[j] == 0的个数,然后大于a[j]的区间长度减去a[i] % a[j] == 0的个数,这就是每个对于每个a[j]来说a[i] % a[j] != 0的个数,//因为前者大于后者;然后再乘以a[j]的个数,//有重复的元素;相乘就是这个数与其他数取摸不等于0的个数最后累加一下就好了,注意会爆int//组合数加起来int肯定容不下;
#include#include #include #include #include #include #include #include using namespace std;//筛选法的应用;;; int main(){ int n, i, j, temp; int m[100006],a[100006]; while(~scanf("%d",&n)) { memset(m,0,sizeof(m)); for(i = 1; i <= n;i++){ scanf("%d",&a[i]); m[a[i]]++;//计算个数;就是计算重复数的个数 } sort(a+1,a+n+1);//排序一下; long long l=0; for(i = 1; i <= n;i++) { if(a[i]!=a[i-1]) { temp=0; for(j = a[i]*2; j <= a[n]; j += a[i])//已经保证前者大于后者了 { temp+=m[j]; } l += (n-i+1-temp-m[a[i]])*m[a[i]]; } } printf("%lld\n",l); } return 0;}
转载地址:https://blog.csdn.net/zw1996/article/details/52189952 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月06日 18时50分04秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Java Callable、Future、FutureTask
2019-04-29
Java 父线程与子线程相互通信的方法
2019-04-29
Java 逃逸分析
2019-04-29
Java 装饰模式
2019-04-29
Java 观察者模式
2019-04-29
Java ReentrantLock源码解读
2019-04-29
Java CompletableFuture
2019-04-29
缓存行、伪共享
2019-04-29
Redis 六种淘汰策略和三种删除策略
2019-04-29
Java LinkedHashMap
2019-04-29
PostgreSQL 关闭session链接
2019-04-29
JPA 多线程同时对一条数据进行Update的问题
2019-04-29
JPA 多线程对数据进行更新,Update和Insert同时存在的问题
2019-04-29
Java 高性能队列Disruptor
2019-04-29
SpringBoot 使用https
2019-04-29
Java 读写锁
2019-04-29
JVM Minor GC、Full GC和Major GC
2019-04-29
SpringBoot @Scheduled 执行两次的问题
2019-04-29
idea maven工程打jar包,运行出现xxx.jar中没有主清单属性的问题解决方法
2019-04-29