51Nod-1441-士兵的数字游戏
来源:互联网 发布:jrtplib ubuntu 编辑:程序博客网 时间:2024/05/06 03:21
ACM模版
描述
题解
感觉这个题卡数据卡的真厉害……一直T~~~最后终于打了一个擦边球过了,基准时间是6s,我用了5s96,真是一件恶心的事。
我的做法比较逗逼,先素数筛,然后合数分解,接着预处理一下,最后直接输出res[a] - res[b]
即可了(One)。
看了一下排行榜,发现第一名好厉害,只用了不到1s,Orz~~~
自信看,发现和我的算法思路完全一样,不一样的是,我的只是简单的将几种算法和处理手段机械的组合在一起,却没有从问题的本质入手,导致饶了些圈子,所以耗时比较多,并且这里使用了输出输出外挂……(Two)。
代码
One:
#include <stdio.h>#include <string.h>const int MAXN = 5e6 + 10;const int MAXF = 1e2;int prime[MAXN];int res[MAXN];bool notprime[MAXN];void getNotPrime(){ memset(notprime, false, sizeof(notprime)); notprime[0] = notprime[1] = true; for (int i = 2; i < MAXN; i++) { if (!notprime[i]) { if (i > MAXN / i) { continue; } for (int j = i * i; j < MAXN; j += i) { notprime[j] = true; } } } return ;}void getPrime(){ for (int i = 2; i < MAXN; i++) { if (!notprime[i]) { prime[++prime[0]] = i; } } return ;}/* * 合数分解 * factor[i][0]存放分解的素数 * factor[i][1]存放对应素数出现的次数 * fatCnt存放合数分解出的素数个数(相同的素数只算一次) */int factor[MAXF][2];int fatCnt;int getFactors(int x){ fatCnt = 0; int tmp = x; for (int i = 1; prime[i] <= tmp / prime[i]; i++) { factor[fatCnt][1] = 0; if (!notprime[tmp]) { factor[fatCnt][0] = tmp; factor[fatCnt++][1]++; tmp = 1; break; } if (tmp % prime[i] == 0) { factor[fatCnt][0] = prime[i]; while (tmp % prime[i] == 0) { factor[fatCnt][1]++; tmp /= prime[i]; } fatCnt++; } } if (tmp != 1) { factor[fatCnt][0] = tmp; factor[fatCnt++][1] = 1; } int res = 0; for (int i = 0; i < fatCnt; i++) { res += factor[i][1]; } return res;}int main(int argc, const char * argv[]){// freopen("/Users/zyj/Desktop/input.txt", "r", stdin);// freopen("/Users/zyj/Desktop/output.txt", "w", stdout); getPrime(); getNotPrime(); // 预处理 for (int i = 2; i < MAXN; i++) { if (!notprime[i]) { res[i] = res[i - 1] + 1; continue; } res[i] = res[i - 1] + getFactors(i); } int t; scanf("%d", &t); int ans; int a, b; while (t--) { ans = 0; scanf("%d %d", &a, &b);// printf("%d %d ", res[a], res[b]); ans = res[a] - res[b]; printf("%d\n", ans); } return 0;}
Two:
#include <stdio.h>const int MAXN = 5e6 + 10;const int BUFSIZE = 20 << 20; // <<10 kb,<<20 MBchar Buf[BUFSIZE + 1], *buf = Buf;inline void scan(int &a){ for (a = 0; *buf < '0' || *buf > '9'; buf++) ; while (*buf >= '0' && *buf <= '9') { a = a * 10 + (*buf - '0'); buf++; } return ;}int pre[MAXN];int a[MAXN];int prime[MAXN];int pk = 0; // 质数个数void getPrime(){ a[1] = 0; for (int i = 2; i < MAXN; i++) { if (a[i] == 0) { prime[pk++] = i; a[i] = 1; } for (int j = 0; i * prime[j] < MAXN; j++) { a[i * prime[j]] = a[i] + 1; if (i % prime[j] == 0) { break; } } } return ;}int main(){ fread(Buf,1,BUFSIZE,stdin); getPrime(); for (int i = 1; i < MAXN; i++) { pre[i] = pre[i - 1] + a[i]; } int t; scan(t); while (t--) { int x, y; scan(x); scan(y); printf("%d\n", pre[x] - pre[y]); } return 0;}
参考
《素数相关》
《合数相关》
1 0
- 51Nod-1441-士兵的数字游戏
- 51nod 1441:士兵的数字游戏
- 51nod-1441 士兵的数字游戏
- 51nod 1441 士兵的数字游戏
- 1441 士兵的数字游戏 51nod
- 51nod 1441 士兵的数字游戏【素数筛】
- [51nod-1441]士兵的数字游戏 题解
- 51nod 1441 士兵的数字游戏 (模拟线性筛)
- 51nod 1441 士兵的数字游戏 (素数筛变形)
- 1441 士兵的数字游戏
- 1441 士兵的数字游戏
- 士兵的数字游戏
- 51nod1441 士兵的数字游戏
- 51nod1441 士兵的数字游戏 分解质因子
- 质数筛 51Nod1441 士兵的数字游戏
- 51Nod-1442-士兵的旅行
- 51Nod-1009-数字1的数量
- 51Nod-1042-数字0~9的数量
- android菜单项无法显示图标
- 河海大学信号与信息处理考研2007-2016年报录比【汇总】
- SQLite集成与用法
- 微信jssdk分享报 config:invalid signature
- Maven的pom.xml 配置详情(转载)
- 51Nod-1441-士兵的数字游戏
- 在线编程工具
- 23种设计模式之桥梁模式
- 利用动态规划解决-字符串的匹配问题
- Struts2的类型转换
- 【sdcard-common】KK版本如何去掉内置T卡
- 1021. Deepest Root (25)
- 图像处理方向常用网站
- 网狐棋牌框架-CopyMemory问题