hdu 4135
2015-08-20 15:04
337 查看
求 [A,B][A,B] 内与 nn 互质的数的个数。
1≤A≤B≤1015,1≤n≤1091 \leq A \leq B \leq 10^{15},1 \leq n \leq 10^9
n≤109n \leq 10^9,所以对 nn 的质因子枚举子集,容斥原理计算。
因为 2∗3∗5∗7∗11∗13∗17∗19∗23∗29∗31>1092*3*5*7*11*13*17*19*23*29*31 > 10^9
所以 nn 的不同质因子最多 1111 个,2112^{11} 的枚举是可以承受的。
时间复杂度:O(n−−√+2p) O(\sqrt n+2^{p})~~~ ( pp 为 nn 的质因子个数 )
1≤A≤B≤1015,1≤n≤1091 \leq A \leq B \leq 10^{15},1 \leq n \leq 10^9
n≤109n \leq 10^9,所以对 nn 的质因子枚举子集,容斥原理计算。
因为 2∗3∗5∗7∗11∗13∗17∗19∗23∗29∗31>1092*3*5*7*11*13*17*19*23*29*31 > 10^9
所以 nn 的不同质因子最多 1111 个,2112^{11} 的枚举是可以承受的。
时间复杂度:O(n−−√+2p) O(\sqrt n+2^{p})~~~ ( pp 为 nn 的质因子个数 )
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <string> #include <vector> #include <stack> #include <queue> #include <utility> #include <iostream> #include <algorithm> template<class Num>void read(Num &x) { char c; int flag = 1; while((c = getchar()) < '0' || c > '9') if(c == '-') flag *= -1; x = c - '0'; while((c = getchar()) >= '0' && c <= '9') x = (x<<3) + (x<<1) + (c-'0'); x *= flag; return; } template<class Num>void write(Num x) { if(x < 0) putchar('-'), x = -x; static char s[20];int sl = 0; while(x) s[sl++] = x%10 + '0',x /= 10; if(!sl) {putchar('0');return;} while(sl) putchar(s[--sl]); } #define REP(__i,__start,__end) for(int __i = (__start); __i <= (__end); __i++) const int size = 31624, add[2] = {-1, 1}; const double eps = 1e-4; int n; long long A, B, ans; int prime[size], tot; void prework() { int sz = sqrt(n) + eps, tp = n; tot = 0; REP(i, 2, sz) { if(!(tp % i)) { while(!(tp % i)) tp /= i; prime[tot++] = i; sz = std::min(sz, tp); } } if(tp != 1) prime[tot ++] = tp; } long long solve(long long S) { long long ret = S; REP(i, 0, (1<<tot) - 1) { int poi = 1, cnt = 0; REP(j, 0, tot - 1) if((i >> j)&1) { poi *= prime[j]; cnt++; } ret += (S/poi) * add[cnt&1]; } return S - ret; } int main() { int T; #ifndef ONLINE_JUDGE freopen("4135.in","r",stdin); freopen("4135.out","w",stdout); #endif read(T); REP(CaseNum, 1, T) { printf("Case #%d: ", CaseNum); read(A), read(B), read(n); prework(); ans = solve(B) - solve(A - 1); write(ans), puts(""); } #ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout); #endif return 0; }
相关文章推荐
- js判断为空Null与字符串为空简写方法
- iOS tcpdump抓包方法
- 基于比较与非比较的排序算法
- ASP.NET学习笔记01
- [转]JSP中常见的Tomcat报错错误解析(二)
- Java之观察者模式(Observer Pattern)
- Ubuntu 下安装 WireShark
- Android Icon的尺寸要求
- 欢迎使用CSDN-markdown编辑器
- SpringMVC入门----阿冬专栏
- vc USB的HID通讯类封装
- 详解Android开发中常用的 DPI / DP / SP
- DEFINE_PER_CPU
- iOS系统网络抓包方法
- mac上使用github命令提交代码实例(三)创建Android项目
- Ext-ajax请求数据
- [NOIP2003]栈
- 用solr DIH 实现mysql 数据定时,增量同步到solr
- [转]JSP中常见的Tomcat报错错误解析(一)
- Maven学习总结(六)——Maven与Eclipse整合