Description

 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j。

  

Input

第一行两个数n,m。

Output

  一个整数表示答案mod 19940417的值

Sample Input

3 4

Sample Output

1

样例说明
  答案为(3 mod 1)*(4 mod 2)+(3 mod 1) * (4 mod 3)+(3 mod
1) * (4 mod 4) + (3 mod 2) * (4 mod 1) + (3 mod 2) * (4 mod 3) + (3 mod 2) * (4
mod 4) + (3 mod 3) * (4 mod 1) + (3 mod 3) * (4 mod 2) + (3 mod 3) * (4 mod 4)
= 1

数据规模和约定
  对于100%的数据n,m<=10^9。

由题意:

∑∑((n mod i) * (m
mod j)) ( i≠j)= ∑(n mod i) * ∑(m mod i) - ∑((n mod i) * (m mod i))=
∑(n-[n/i]*i) * ∑(m-[m/i]*i) - ∑(nm-([n/i]+[m/i])i+[n/i][m/i]*i*i)= ∑(n-[n/i]*i)
* ∑(m-[m/i]*i) – n*n*m+∑[n/i]i+∑[m/i]i-∑[n/i][m/i]*i*i(n <= m)

然后利用[n/i]的分组加速运算即可,不过中间过程有多处需要注意的,

m/(m/i)的时候需要和n比较大小,因为可能会超出范围。

此外就是int乘法可能会爆,需要转long long,中间过程别忘了MOD

 

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <cstring>
  6. #include <algorithm>
  7. #include <set>
  8. #include <map>
  9. #include <queue>
  10. #include <string>
  11. #define LL long long
  12. #define MOD 19940417
  13. #define nsix 3323403
  14.  
  15. using namespace std;
  16.  
  17. int n, m;
  18.  
  19. LL cal(int len, int x)
  20. {
  21. LL ans = , tmp;
  22. int j;
  23. for (int i = ; i <= len; ++i)
  24. {
  25. j = min(len, x/(x/i));//这一句不用min,j会越界
  26. tmp = ((LL)i+j)*(j-i+)/%MOD;
  27. ans += tmp*(x/i)%MOD;
  28. ans %= MOD;
  29. i = j;
  30. }
  31. return ans;
  32. }
  33.  
  34. inline LL sum(LL x)
  35. {
  36. return x*(x+)%MOD*(*x+)%MOD*nsix%MOD;
  37. }
  38.  
  39. LL cal2(int x, int y)
  40. {
  41. LL ans = , tmp, ttmp;
  42. int j;
  43. for (int i = ; i <= x; ++i)
  44. {
  45. j = min(x/(x/i), y/(y/i));
  46. //j = min(j, x);
  47. tmp = sum(j)-sum(i-);
  48. tmp = (tmp%MOD+MOD)%MOD;
  49. ttmp = ((LL)x/i)*(y/i)%MOD;
  50. ans += tmp*ttmp%MOD;
  51. ans %= MOD;
  52. i = j;
  53. }
  54. return ans;
  55. }
  56.  
  57. void work()
  58. {
  59. if (n > m) swap(n, m);
  60. LL ans, m2, n2, snn, smm, snm, ss;
  61. m2 = (LL)m*m%MOD;
  62. n2 = (LL)n*n%MOD;
  63. smm = cal(m, m);
  64. snn = cal(n, n);
  65. snm = cal(n, m);
  66. ss = cal2(n, m);
  67. ans = m2*n2%MOD - m2*snn%MOD - n2*smm%MOD + snn*smm%MOD;
  68. ans -= m*n2%MOD;
  69. ans += m*snn%MOD;
  70. ans += n*snm%MOD;
  71. ans -= ss;
  72. ans = (ans%MOD+MOD)%MOD;
  73. printf("%lld\n", ans);
  74. }
  75.  
  76. int main()
  77. {
  78. //freopen("test.in", "r", stdin);
  79. while (scanf("%d%d", &n, &m) != EOF)
  80. work();
  81. return ;
  82. }

ACM学习历程—BZOJ2956 模积和(数论)的更多相关文章

  1. ACM学习历程—HDU5667 Sequence(数论 && 矩阵乘法 && 快速幂)

    http://acm.hdu.edu.cn/showproblem.php?pid=5667 这题的关键是处理指数,因为最后结果是a^t这种的,主要是如何计算t. 发现t是一个递推式,t(n) = c ...

  2. ACM学习历程—HDU5668 Circle(数论)

    http://acm.hdu.edu.cn/showproblem.php?pid=5668 这题的话,假设每次报x个,那么可以模拟一遍, 假设第i个出局的是a[i],那么从第i-1个出局的人后,重新 ...

  3. ACM学习历程—HDU5666 Segment(数论)

    http://acm.hdu.edu.cn/showproblem.php?pid=5666 这题的关键是q为质数,不妨设线段上点(x0, y0),则x0+y0=q. 那么直线方程则为y = y0/x ...

  4. ACM学习历程—HDU5585 Numbers(数论 || 大数)(BestCoder Round #64 (div.2) 1001)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5585 题目大意就是求大数是否能被2,3,5整除. 我直接上了Java大数,不过可以对末尾来判断2和5, ...

  5. BZOJ2956: 模积和(数论分块)

    题意 题目链接 Sol 啊啊这题好恶心啊,推的时候一堆细节qwq \(a \% i = a - \frac{a}{i} * i\) 把所有的都展开,直接分块.关键是那个\(i \not= j\)的地方 ...

  6. ACM学习历程—HDU5637 Transform(数论 && 最短路)

    题目链接:http://codeforces.com/problemset/problem/590/A 题目大意是给两种操作,然后给你一个s,一个t,求s至少需要多少次操作到t. 考虑到第一种操作是将 ...

  7. ACM学习历程—SNNUOJ1132 余数之和(数论)

    Description F(n) = (n % 1) + (n % 2) + (n % 3) + ...... (n % n).其中%表示Mod,也就是余数.例如F(6) = 6 % 1 + 6 % ...

  8. ACM学习历程—HDU1719 Friend(数论)

    Description Friend number are defined recursively as follows. (1) numbers 1 and 2 are friend number; ...

  9. 【bzoj2956】模积和 数论

    题目描述 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. 输入 第一行两个数n,m. 输出 一个整数表示答案mod 1994041 ...

随机推荐

  1. [CTSC2001]1378 选课

      1378 选课 题目描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修了这 ...

  2. VS2010 fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    VS2010在经历一些更新后,建立Win32 Console Project时会出“error LNK1123” 错误,解决方案为将 项目|项目属性|配置属性|清单工具|输入和输出|嵌入清单 “是”改 ...

  3. M - 基础DP

    M - 基础DP Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descriptio ...

  4. EasyDarwin开源流媒体服务器Golang版本:拉转推功能之拉流实现方法

    EasyDarwin开源流媒体服务器(www.easydarwin.org),拉转推是一个很有意义的功能,它可将一个独立的RTSP数据源"拉"到服务器,再通过转发协议转发给多个客户 ...

  5. EasyDSS流媒体解决方案实现的RTMP/HLS视频直播、直播鉴权(如何完美将EasyDSS过渡到新版)

    上一篇博文介绍了EasyDSS点播功能,然后作为RTMP流媒体服务器,接受RTMP推流.进行实时的直播流分发又是自身一大核心功能. 需求背景: 写本篇博文的一个目的是向大家介绍一下EasyDSS新版的 ...

  6. Spring MVC的视图解析器

    一.视图解析器简介 在Spring MVC中,当Controller将请求处理结果放入到ModelAndView中以后,DispatcherServlet会根据ModelAndView选择合适的视图进 ...

  7. ibatis中井号跟美元符号区别(#.$)

    1.#可以进行预编译,进行类型匹配,#变量名# 会转化为 jdbc 的 类型 $不进行数据类型匹配,$变量名$就直接把 $name$替换为 name的内容 例如: select * from tabl ...

  8. <%%>与<scriptrunat=server>,<%=%>与<%#%>的区别(转)

    这些东西都是asp.net前台页面与后台代码交互过程中经常使用的,它们之间有的非常相似,又有一些不同.对比学习下,看看他们之间的联系与区别. 首先看<%%>与<scriptrunat ...

  9. Ubuntu中安装FTP 服务器自己踩得坑

    12点多了,擦!做个码农真不容易呀! 系统:Ubuntu16.04 安装:FTP 步骤: 1.不管有没有一上来我先卸载: sudo apt-get purge vsftpd 2.再安装:sudo ap ...

  10. A vectorized example

    http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture4.pdf