题意:。。。就题面一句话

思路:比赛一看公式,就想到要用到约数个数定理

约数个数定理就是:

对于一个大于1正整数n可以分解质因数

则n的正约数的个数就是

对于n^k其实就是每个因子的个数乘了一个K
然后现在就变成了求每个数的每个质因子有多少个,但是比赛的时候只想到sqrt(n)的分解方法,总复杂度爆炸,就一直没过去,然后赛后看官方题解感觉好妙啊!
通过类似素数筛法的方式,把L - R的质因子给分解,就可以在O(nlogn)的时间之内把所以的数给筛出来。
代码:
  1. /** @xigua */
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <iostream>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <stack>
  8. #include <cstring>
  9. #include <queue>
  10. #include <set>
  11. #include <string>
  12. #include <map>
  13. #include <climits>
  14. #define PI acos(-1)
  15. using namespace std;
  16. typedef long long ll;
  17. typedef double db;
  18. const int maxn = 1e6 + 5;
  19. const int mod = 998244353;
  20. const int INF = 1e8 + 5;
  21. const ll inf = 1e15 + 5;
  22. const db eps = 1e-6;
  23. bool is[maxn];
  24. ll pri[maxn]; int cnt;
  25.  
  26. void init() {
  27. for (int i = 2; i < maxn; i++) {
  28. if (!is[i]) {
  29. pri[++cnt] = i; //素数筛
  30. for (int j = i + i; j < maxn; j += i)
  31. is[j] = 1;
  32. }
  33. }
  34. }
  35.  
  36. ll fac[maxn], p[maxn];
  37.  
  38. void solve() {
  39. ll l, r, k; cin >> l >> r >> k;
  40. ll res = 0;
  41. //通过1 到 (r - l + 1)的数组来表示 l 到 r
  42. //fac代表当前数的因子个数,p代表当前数被分解之后的值
  43. for (ll i = l; i <= r; i++)
  44. fac[i-l+1] = 1, p[i-l+1] = i;
  45. for (int i = 1; i <= cnt; i++) {
  46. ll be;
  47. if (l % pri[i] == 0) be = l;
  48. else {
  49. be = l + (pri[i] - l % pri[i]); //找到筛法的起点,因为有些不是从l开始的
  50. }
  51. for (ll j = be; j <= r; j += pri[i]) { //枚举be到r
  52. //每次增加pri[i]就可以保证这个数肯定是pri[i]的倍数
  53. ll tmp = 0;
  54. while (p[j-l+1] % pri[i] == 0) { //看当前质因数的个数
  55. tmp++;
  56. p[j-l+1] /= pri[i];
  57. }
  58. fac[j-l+1] = fac[j-l+1] * (k * tmp % mod + 1) % mod;
  59. }
  60. }
  61. for (ll i = l; i <= r; i++) {
  62. //素数
  63. if (p[i-l+1] != 1) fac[i-l+1] = fac[i-l+1] * (k + 1) % mod;
  64. res = (res + fac[i-l+1]) % mod;
  65. }
  66. cout << res << endl;
  67. }
  68.  
  69. int main() {
  70. int t = 1, cas = 1;
  71. //freopen("in.txt", "r", stdin);
  72. //freopen("out.txt", "w", stdout);
  73. init();
  74. scanf("%d", &t);
  75. while(t--) {
  76. // printf("Case %d: ", cas++);
  77. solve();
  78. }
  79. return 0;
  80. }

  

HDU 6069 Counting Divisors(区间素数筛法)的更多相关文章

  1. hdu 6069 Counting Divisors 筛法

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  2. HDU 6069 Counting Divisors

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  3. HDU 6069 Counting Divisors —— 2017 Multi-University Training 4

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  4. hdu 6069 Counting Divisors(求因子的个数)

    Counting Divisors Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Oth ...

  5. 2017ACM暑期多校联合训练 - Team 4 1003 HDU 6069 Counting Divisors (区间素数筛选+因子数)

    题目链接 Problem Description In mathematics, the function d(n) denotes the number of divisors of positiv ...

  6. HDU 6069 Counting Divisors (素数+筛法)

    题意:给定 l,r,k,让你求,其中 l <= r <= 1e12, r-l <= 1e6, k <= 1e7. 析:首先这个题肯定不能暴力,但是给定的区间较小,可以考虑筛选, ...

  7. hdu 6069 Counting divisors 公式+区间筛

    比赛的时候把公式扣出来了,,但是没有想到用筛法算公因子,,默默学习一下.. 题解:设n=p1^(c1)p2^{c2}...pm^{cm},n=p​1^​c​1*​​​​p​2​^c​2​​​​...p ...

  8. HDU 6069 Counting Divisors(唯一分解定理+因子数)

    http://acm.hdu.edu.cn/showproblem.php?pid=6069 题意: 思路: 根据唯一分解定理,$n={a_{1}}^{p1}*{a2_{}}^{p2}...*{a_{ ...

  9. HDU 6069 Counting Divisors(2017 Multi-University Training Contest - Team 4 )

    Output For each test case, print a single line containing an integer, denoting the answer.   Sample ...

随机推荐

  1. MyEclipse10.0安装SVN的三种方法

    最简单的一种: 首先下载zip包(svn:http://subclipse.tigris.org) 1.直接在MyEclipse10安装目录下的dropins文件夹下新建一个svn文件夹 2.把解压出 ...

  2. Event事件的三个阶段

    转自www.w3school.com.cn/htmldom/event_bubbles.asp 在 2 级 DOM标准中,事件传播分为三个阶段: 第一,捕获阶段.事件从 Document 对象沿着文档 ...

  3. 451. Sort Characters By Frequency (sort map)

    Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...

  4. Lightoj 1147【DP】

    题意: 把n个人分成两部分,要你怎么分使得两部分尽可能相等: 思路: 如果我们把一部分人的重量达到离sum/2最近,那就一定行啊 其实就是一条棒,两种不同的棒去拼接成一条棒,然后最好就是离mid最近, ...

  5. Unity3D研究院之IOS Android支持中文与本地文件的读取写

       前几天有个朋友问我为什么在IOS平台中可以正常的读写文件可是在Android平台中就无法正常的读写.当时因为在上班所以我没时间来帮他解决,晚上回家后我就拿起安卓手机真机调试很快就定位问题所在,原 ...

  6. js中 call() ,apply(),bing()方法三者的用法和区别

    面试中经常会被问到的,或者做笔试题的时候也会有这样的问题,所以今天专门对这个问题做个总结: 先看个例子: var age = '19' var myObj = { name:'小赖', myAge:t ...

  7. mysql--浅谈查询1

    这是对自己学习燕十八老师mysql教程的总结,非常感谢燕十八老师. 依赖软件:mysql5.6 系统环境:win 在谈查询之前,先说一个特别重要的概念 一定将列名看成变量,既然是变量就可以运算 一定将 ...

  8. 企业级应用,如何实现服务化三(dubbo入门案例)

    今天是六一儿童节,从千里之外的广州,回到了贵州老家,真好!好山好水好心情,好了接着写点东西.这是企业级应用,如何实现服务化系列的第三篇.在上一篇:企业级应用,如何实现服务化二(dubbo架构)中,认识 ...

  9. CentOS(6、7)修改主机名(hostname)

    centos6需要修改两处:一处是/etc/sysconfig/network,另一处是/etc/hosts,只修改任一处会导致系统启动异常.首先切换到root用户. /etc/sysconfig/n ...

  10. C#基础之析构函数