UVa 11876 - N + NOD (N)
来源:互联网 发布:手机医院挂号软件 编辑:程序博客网 时间:2024/05/21 20:57
題目:題目給出公式,Ni = Ni-1 + NOD(Ni-1),NOD为因子个数,求一个区间[A,B]上有多少个N。
分析:数论,dp,打表。打表计算,查询输出。
首先,打表计算出1000000内的所有素数;
然后,利用素数表,计算1000000内所有数字的因子个数(组合数学,每个因子个数+1相乘);
之后,计算N,然后dp计算区间[0,i]的N个个数S(i);
最后输出S(B)- S(A-1)。
說明:╮(╯▽╰)╭。
#include <cstring>#include <cstdio>int visit[1000001];int prime[1000001];int divid[1000001];int N[1000001];int M[1000001];int S[1000001];int main(){//打表计算素数 memset(visit, 0, sizeof(visit));int count = 0;for (int i = 2; i < 1000001; ++ i)if (!visit[i]) {prime[count ++] = i;for (int j = i+i; j < 1000001; j += i)visit[j] = 1;}//计算因数个数 memset(divid, 0, sizeof(divid));divid[0] = 0; divid[1] = 1;for (int i = 2; i < 1000001; ++ i) {int value = i, ans = 1, move = 0;while (visit[value] && value > 1) {int size = 0;while (value%prime[move] == 0) {value /= prime[move];size ++;}move ++;ans *= (size+1);}if (value > 1) ans *= 2;divid[i] = ans;}//计算N对应的映射 memset(M, 0, sizeof(M));M[N[0] = 1] = 1;for (int i = 1; i < 1000001; ++ i) {N[i] = N[i-1] + divid[N[i-1]];if (N[i] > 1000000) break;M[N[i]] = 1;}//计算对应区间[0, i]内N总数 memset(S, 0, sizeof(S));for (int i = 1; i < 1000001; ++ i)S[i] = S[i-1] + M[i];int T, A, B;while (~scanf("%d",&T))for (int t = 1; t <= T; ++ t){scanf("%d%d",&A,&B);printf("Case %d: %d\n",t,S[B]-S[A-1]);} return 0;}
0 0
- UVa 11876 - N + NOD (N)
- UVa11876 - N + NOD (N)
- 51NOD N!
- 51nod 1004 n^n问题
- 51nod N的阶乘
- 51nod N的阶乘
- 51Nod-1582-n叉树
- uva 2553(n皇后)
- UVA 11526 - H(n)
- UVa 11526 - H(n)
- UVa 11526 - H(n)
- Uva-11526 H(n)
- uva 11526 H(n)
- UVA 11526 H(n)
- UVa 11526 - H(n)
- H(n) UVA
- UVa 446 - Kibbles "n" Bits "n" Bits "n" Bits
- 51nod 1004 n^n的末尾数字
- 关于mr-jobhistory-daemon.sh的一些了解
- mysql innodb 自增主键与innodb_autoinc_lock_mode
- SharedPreferences深度解析
- afnetworking3.0小试
- Linux调试技术
- UVa 11876 - N + NOD (N)
- TCP三次握手连接
- 从零开始学Objective-C(01)选择Objective-C之路
- Velocity 的初次体验
- 杭电oj1869 六度分离(SPFA floyd详解)
- 游戏作弊器制作教程六:hook的各种姿势
- MongoDB 3.0的Explain
- 关于Alcatraz下的CocoaPods插件问题
- linux下opencv 2.4.9 的编译