题意:给出n(1<=n<=10^8),求小于n的,求所有与n互质的数字的四次幂的加和是多少。

分析:容斥原理

首先要知道四次幂求和公式,1^4+2^4+...+n^4=n*(n+1)*(2n+1)*(3n^2+3n-1)/30

先求所有小于等于n的数字的四次幂和,然后减去那些不互质的即可。

这个减去的过程用到了容斥原理。

先对n分解质因子,每个不同的质因子只保留一个。

然后分别枚举这些质因子的组合情况,由奇数个因子组成的数要减去,由偶数个因子组成的数要加上。

对于一个因子组合的乘积a,我们需要一次性计算a^4+(2a)^4 + (3a)^4+...

将其转化为a^4 * (1^4+2^4+...)即可。

这道题还有一个难点,就是公式中有除法(除以30),却还要进行模运算。

除法是不支持模运算的,因此我们要将除法转化为乘法,除以30变为乘以30的逆元。

逆元的意思是,如果a、b互为mod c下的逆元,则a * b = 1 (mod c)。

求逆元可以用扩展欧几里德gcd(30,MOD,x,y),把x/gcd(30,MOD)整理到0~MOD-1范围内即为30的逆元。

具体原因查阅扩展欧几里德算法

  1. #include <cstdio>
  2. using namespace std;
  3.  
  4. #define D(x)
  5.  
  6. const int MOD = (int)(1e9) + ;
  7. const int MAX_FACTOR = ;
  8.  
  9. int n;
  10. int factor_num;
  11. long long factor[MAX_FACTOR];
  12. long long inverse;
  13.  
  14. //n(n+1)(2n+1)(3n^2+3n-1)/30
  15.  
  16. long long to_forth(long long value)
  17. {
  18. long long ret = value;
  19. ret = ret * ret % MOD;
  20. ret = ret * ret % MOD;
  21. return ret;
  22. }
  23.  
  24. long long cal(long long value)
  25. {
  26. long long num = n / value;
  27. long long ret = ;
  28. ret = ret * num % MOD * (num + ) % MOD;
  29. ret = ret * ( * num + ) % MOD;
  30. ret = ret * ((num * num % MOD * % MOD + * num % MOD - ) % MOD) % MOD;
  31. if (ret / != ret * inverse % MOD)
  32. {
  33. D(printf("#%lld %lld\n", ret / , ret * inverse % MOD));
  34. }else
  35. {
  36. D(printf("**\n"));
  37. }
  38. ret = ret * inverse % MOD;
  39.  
  40. ret = ret * to_forth(value) % MOD;
  41.  
  42. return ret;
  43. }
  44.  
  45. void get_factors()
  46. {
  47. factor_num = ;
  48. int m = n;
  49. for (int i = ; i * i <= m; i++)
  50. {
  51. if (m % i == )
  52. factor[factor_num++] = i;
  53. while (m % i == )
  54. {
  55. m /= i;
  56. }
  57. }
  58. if (m != )
  59. {
  60. factor[factor_num++] = m;
  61. }
  62. }
  63.  
  64. long long work()
  65. {
  66. long long ans = ;
  67. for (int i = ; i < ( << factor_num); i++)
  68. {
  69. int num = ;
  70. long long temp = ;
  71. int index = ;
  72. for (int mask = ; mask <= i; mask <<= , index++)
  73. {
  74. if ((mask & i) == )
  75. {
  76. continue;
  77. }
  78. num++;
  79. temp *= factor[index];
  80. }
  81. D(printf("temp=%lld\n", temp));
  82. if (num & )
  83. ans += cal(temp);
  84. else
  85. ans -= cal(temp);
  86. ans = (ans % MOD + MOD) % MOD;
  87. }
  88. ans = ((cal() - ans) % MOD + MOD) % MOD;
  89. return ans;
  90. }
  91.  
  92. void gcd_extend(long long a,long long b,long long &g,long long &x,long long &y)
  93. {
  94. if (!b)
  95. {
  96. g = a;
  97. x = ;
  98. y = ;
  99. return;
  100. }
  101. gcd_extend(b, a % b, g, y, x);
  102. y -= a / b * x;
  103. }
  104.  
  105. int main()
  106. {
  107. long long x, y, g;
  108. gcd_extend(, MOD, g, x, y);
  109. D(printf("%lld %lld %lld\n", x, y, g));
  110. x = (x % MOD + MOD) % MOD;
  111. inverse = x / g;
  112. D(printf("%lld\n", inverse));
  113. D(printf("%lld\n", inverse * % MOD));
  114. int t;
  115. scanf("%d", &t);
  116. while (t--)
  117. {
  118. scanf("%d", &n);
  119. if (n == )
  120. {
  121. puts("");
  122. continue;
  123. }
  124. get_factors();
  125. int ans_int = work();
  126. printf("%d\n", ans_int);
  127. }
  128. return ;
  129. }

zju3547的更多相关文章

随机推荐

  1. JDK自带方法实现AES对称加密

    请看代码. 1 package jdbc.pro.lin; 2 3 import java.security.InvalidAlgorithmParameterException; 4 import ...

  2. MySQL里的found_row()与row_count()的解释及用法

    MySQL中有两个函数来计算上一条语句影响了多少行,不同于SqlServer/Oracle,不要因为此方面的差异而引起功能问题   出处:mysqlpub.com MySQL中有两个函数来计算上一条语 ...

  3. Unity相关路径

    Application.dataPath 只读 在项目根目录下读取文件,但移动端没有访问权限.一般适用于PC端调试用. Application.streamingAssetsPath 在Assets目 ...

  4. [整理]AngularJS学习资源

    https://angular.io/docs/js/latest/(2.0官方网站) http://www.linuxidc.com/Linux/2014-05/102139.htm(Angular ...

  5. 深入理解Javascript面向对象编程

    深入理解Javascript面向对象编程 阅读目录 一:理解构造函数原型(prototype)机制 二:理解原型域链的概念 三:理解原型继承机制 四:理解使用类继承(继承的更好的方案) 五:建议使用封 ...

  6. WCF binding的那些事!!!

    原文地址:http://www.cnblogs.com/Anima0My/archive/2008/04/16/1156146.html WCF中常用的binding方式: BasicHttpBind ...

  7. Tomcat 6 —— Realm域管理

    本篇来源于官方文档,但不仅仅是翻译,其中不乏网上搜索的资料与自己的理解. 如有错误,请予指正. 什么是Realm 首先说一下什么是Realm,可以把它理解成“域”,也可以理解成“组”,因为它类似 类U ...

  8. 系列文章:老项目的#iPhone6与iPhone6Plus适配#(持续更新中,更新日期2014年10月12日 星期日 )

    本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020399.html ,转载请注明出处. ********************************** ...

  9. rem和em,px的使用

    rem是CSS3中新增加的一个单位值,他和em单位一样,都是一个相对单位.不同的是em是相对于元素的父元素的font-size进行计算:rem是相对于根元素html的font-size进行计算.这样一 ...

  10. CentOS 6.5 zabbix 3.0.4 监控MySQL性能

    安装mysql [root@test3 /]# yum -y install mysql mysql-server 初始化数据库 [root@test3 /]# /etc/init.d/mysqld ...