【Link】:http://acm.hdu.edu.cn/showproblem.php?pid=6069

【Description】



定义d(i)为数字i的因子个数;

求∑rld(ik)

其中l,r<=1012且r−l<=106

【Solution】



如果把一个数x质因数分解成p1a1∗p2a2∗...∗pnan

的形式;

可知数字x的因子个数为

(a1+1)∗(a2+1)∗...∗(an+1)

因为i还有k次方;

所以答案就是

(a1∗k+1)∗(a2∗k+1)∗...∗(an∗k+1)

需要对l..r里面所有的数字都进行质因数分解;

可以这样

先处理出2..r√之间的所有素数;

然后枚举每个素数i它在l..r之间的倍数x;

则对x 用素数i进行质因数分解,也即一直除它;

这样,就能算出来x在质因数分解的时候,素数i最后的指数是多少了;

(累乘数字x的答案就好);

记录x在进行质因数分解的时候被除剩下的数字,除的时候是用

这个记录的数字除;

最后这个数字可能会不变;

因为它本身可能就是一个素数;

所以小于r√的素数可能不是它的因子;

但是不可能还有大于r√的因子;

所以如果除剩下的数字还大于0;

答案再乘上(k+1)就好;

最后把每个数字它的答案累加起来;

(一开始可以用O(n)的素数筛求出1..n之间的所有素数);



【NumberOf WA】



many times



【Reviw】



一开始一直往O(n14)的质因数分解想了;

没想到这种方法.

判断出某个素数是某个数的因子之后,不要再记录它的因子是什么了;

直接就开始质因数分解,这样比较快;

不然会超时.



【Code】

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define lson l,m,rt<<1
  4. #define rson m+1,r,rt<<1|1
  5. #define LL long long
  6. #define rep1(i,a,b) for (int i = a;i <= b;i++)
  7. #define rep2(i,a,b) for (int i = a;i >= b;i--)
  8. #define mp make_pair
  9. #define pb push_back
  10. #define fi first
  11. #define se second
  12. #define ms(x,y) memset(x,y,sizeof x)
  13. #define ri(x) scanf("%d",&x)
  14. #define rl(x) scanf("%lld",&x)
  15. #define rs(x) scanf("%s",x+1)
  16. #define oi(x) printf("%d",x)
  17. #define ol(x) printf("%lld",x)
  18. #define Open() freopen("F:\\rush.txt","r",stdin)
  19. #define Close() ios::sync_with_stdio(0)
  20. typedef pair<int,int> pii;
  21. typedef pair<LL,LL> pll;
  22. const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
  23. const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
  24. const double pi = acos(-1.0);
  25. const int N = 1e6;
  26. const LL MOD = 998244353;
  27. bool iszs[N+100];
  28. vector <int> zsb;
  29. LL num[N+100],ans[N+100];
  30. int main(){
  31. //Open();
  32. //Close();
  33. ms(iszs,true);
  34. rep1(i,2,N)
  35. {
  36. if (iszs[i]) zsb.pb(i);
  37. int len = zsb.size();
  38. rep1(j,0,len-1)
  39. {
  40. int t = zsb[j];
  41. if (i*t>N) break;
  42. iszs[i*t] = false;
  43. if (i%t==0) break;
  44. }
  45. }
  46. int T;
  47. ri(T);
  48. while (T--){
  49. LL l,r,k;
  50. rl(l),rl(r),rl(k);
  51. for (LL i = l;i <= r;i++)
  52. num[i-l+1] = i,ans[i-l+1] = 1;
  53. rep1(i,0,(int) zsb.size()-1){
  54. LL x = zsb[i];
  55. if (x > r) break;
  56. LL temp = ((l-1)/x + 1)*x;
  57. for (LL i = temp;i <= r;i+=x){
  58. LL tot = i,cnt = 0;
  59. while (tot%x==0){
  60. tot/=x;
  61. num[i-l+1]/=x;
  62. cnt++;
  63. }
  64. ans[i-l+1] = ans[i-l+1]*(cnt*k+1)%MOD;
  65. }
  66. }
  67. LL fans = 0;
  68. for (LL i = l;i <= r;i++){
  69. if (num[i-l+1]!=1){
  70. fans = (fans + ans[i-l+1]*(k+1)%MOD)%MOD;
  71. }else
  72. fans = (fans + ans[i-l+1])%MOD;
  73. }
  74. ol(fans);puts("");
  75. }
  76. return 0;
  77. }

【2017 Multi-University Training Contest - Team 4】Counting Divisors的更多相关文章

  1. 2017 Multi-University Training Contest - Team 4 hdu6069 Counting Divisors

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6069 题目: Counting Divisors Time Limit: 10000/5000 ...

  2. 2017 Multi-University Training Contest - Team 4——HDU6069&&Counting Divisors

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6069 题目意思:首先解释一下d[n]这个函数表示n有多少个因子,百度一下可以知道这个函数是一个非完全积 ...

  3. 【2017 Multi-University Training Contest - Team 2】TrickGCD

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6053 [Description] 给你一个b数组,让你求一个a数组: 要求,该数组的每一位都小于等 ...

  4. 【2017 Multi-University Training Contest - Team 2】Maximum Sequence

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6047 [Description] 给你一个数列a和一个数列b; 只告诉你a的前n项各是什么; 然后 ...

  5. 【2017 Multi-University Training Contest - Team 2】 Regular polygon

    [Link]: [Description] 给你n个点整数点; 问你这n个点,能够组成多少个正多边形 [Solution] 整点只能构成正四边形. 则先把所有的边预处理出来; 枚举每某两条边为对角线的 ...

  6. 【2017 Multi-University Training Contest - Team 2】 Is Derek lying?

    [Link]: [Description] 两个人都做了完全一样的n道选择题,每道题都只有'A','B','C' 三个选项,,每道题答对的话得1分,答错不得分也不扣分,告诉你两个人全部n道题各自选的是 ...

  7. 【2017 Multi-University Training Contest - Team 5】Rikka with Competition

    [Link]: [Description] [Solution] 把所有人的能力从大到小排; 能力最大的肯定可能拿冠军; 然后一个一个地往后扫描; 一旦出现a[i-1]-a[i]>k; 则说明从 ...

  8. 【2017 Multi-University Training Contest - Team 5】Rikka with Subset

    [Link]: [Description] 给你a数组的n个数的所有2^n个子集的2^n个子集元素的和; 子集元素的和最大为m; 告诉你各个子集元素的和出现的次数; 如 1 2 则0出现1次,1出现1 ...

  9. 【2017 Multi-University Training Contest - Team 5】Rikka with Graph

    [Link]:http://acm.hdu.edu.cn/showproblem.php?pid=6090 [Description] 给你n个点; 让你在这n个点上最多连m条无向边; 使得 ∑ni= ...

随机推荐

  1. windows或linux安装python

    一.windows安装 先进入 python 官网:https://www.python.org/downloads/windows/ 选择合适的版本下载: 下载完成,双击运行安装[勾选Add to ...

  2. NodeJS学习笔记 (11)网络UDP-dgram(ok)

    模块概览 dgram模块是对UDP socket的一层封装,相对net模块简单很多,下面看例子. UPD客户端 vs UDP服务端 首先,启动UDP server,监听来自端口33333的请求. se ...

  3. iOS——扬声器与听筒的切换

    1.扬声器模式:  NSError *error; [[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPor ...

  4. BZOJ 2141 排队(分块+树状数组)

    题意 第一行为一个正整数n,表示小朋友的数量:第二行包含n个由空格分隔的正整数h1,h2,…,hn,依次表示初始队列中小朋友的身高:第三行为一个正整数m,表示交换操作的次数:以下m行每行包含两个正整数 ...

  5. 题解 CF915D 【Almost Acyclic Graph】

    这道题我第一次的想法是直接判环的数量,然而事实证明实在是太naive了. 随便画个图都可以卡掉我的解法.(不知道在想什么) 这道题的正解是拓扑排序. 朴素的想法是对所有边都跑一次拓扑,但这样$O(m( ...

  6. CsGL着色的三角形

    转自NeHe教程 public override void Draw() { // Here's Where We Do All The Drawing glClear(GL_COLOR_BUFFER ...

  7. Qt 5.3 下OpenCV 2.4.11 开发(0)图像处理基本概念

    1.普通情况下的RGB彩色图像:它的每一个像素点都是由三个通道组成,即红色(R).绿色(G)和蓝色(B).8位三通道彩色图像就是每一个像素中每一个通道的取值范围都是 0~255(即二进制下的8位数), ...

  8. iOS多线程与网络开发之多线程GCD

    郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主.捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...

  9. shell 脚本去掉月份和天数的前导零

    #!/bin/sh # # shell 脚本去掉月份和天数的前导零 # 前面填 1 变成百位数,然后减 100 # 去掉前导零的通用方法 $((10#$(date +%m))) # 把字符串分割成数组 ...

  10. USACO2011 Jan:公司利润

    简要题意: 奶牛开了家公司,已经连续运作了N 天.它们在第i 天获得了Ai元的利润,不过有些天是亏钱的,这种情况下利润就是一个负数.约翰想为它们写个新闻,吹嘘它们的惊人业绩.请你帮助他选出一段连续的日 ...