记录编号 143923 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队 2011] Crash的数字表格 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 6.250 s
提交时间 2014-12-18 19:50:40 内存使用 118.08 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. typedef long long LL;
  7. const LL MOD=20101009;
  8. const int SIZE=10000010;
  9. LL miu[SIZE];
  10. LL Section_Endpoint(LL n,LL m,LL i){//n/j!=n/i或m/j!=m/i的第一个j,除法是int意义
  11. return min(n/(n/i),m/(m/i));
  12. }
  13. LL Sigma_NNS(LL m,LL n){//1~n求和
  14. return ((m+n)*(n-m+1)/2)%MOD;
  15. }
  16. LL Sigma_RP_Mul(LL a,LL b){//1<=x<=a,1<=y<=b,gcd(x,y)=1的xy求和
  17. LL ans=0,i=1,j;
  18. while(i<=a&&i<=b){
  19. j=Section_Endpoint(a,b,i);
  20. LL now=(Sigma_NNS(1,a/i)*Sigma_NNS(1,b/i))%MOD;
  21. now=(now*(miu[j]-miu[i-1]+MOD))%MOD;
  22. ans=(ans+now)%MOD;
  23. i=j+1;
  24. }
  25. return ans;
  26. }
  27. LL Calc(LL n,LL m){//就是题目让求的那个东西
  28. LL ans=0,i=1,j;
  29. while(i<=n&&i<=m){
  30. j=Section_Endpoint(n,m,i);
  31. //求解i<=gcd(x,y)<=j的lcm(x,y)之和
  32. LL now=(Sigma_NNS(i,j)*Sigma_RP_Mul(n/i,m/i))%MOD;
  33. ans=(ans+now)%MOD;
  34. i=j+1;
  35. }
  36. return ans;
  37. }
  38. void Linear_Sieve_Method(int n){//线性筛!
  39. static bool flag[SIZE]={0};
  40. static int ptot=0,p[SIZE];
  41. for(int i=1;i<=n;i++) miu[i]=1;
  42. for(int i=2;i<=n;i++){
  43. if(!flag[i]) p[++ptot]=i,miu[i]=-1;
  44. for(int j=1;j<=ptot;j++){
  45. if((LL)i*p[j]>n) break;
  46. flag[i*p[j]]=true,miu[i*p[j]]=-miu[i];
  47. if(i%p[j]==0){
  48. miu[i*p[j]]=0;
  49. break;
  50. }
  51. }
  52. }
  53. for(int i=1;i<=n;i++) miu[i]=(miu[i-1]+(LL)i*i*miu[i])%MOD;
  54. }
  55. int main(){
  56. freopen("nt2011_table.in","r",stdin);
  57. freopen("nt2011_table.out","w",stdout);
  58. LL n,m;
  59. scanf("%lld%lld",&n,&m);
  60. Linear_Sieve_Method(n);
  61. printf("%lld\n",Calc(n,m));
  62. return 0;
  63. }