题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1575

万年巨坑终于填掉了……

首先是煞笔西瓜的做题历程O_O。

原题要求$\sum_{i=1}^n\sum_{j=1}^i\sum_{k=1}^i [(i,j),(i,k)]$

那么先推一波式子吧

balabala

我也忘记自己是怎么推的了(雾

总之最后推出来是这样的

$ ans=\sum_{i=1}^{n} f(\left\lfloor\frac{n}{i}\right\rfloor)*g(i) $

其中 $ f(x)=\sum_{i=1}^{x} μ(i)*i^2*\frac{\frac{x}{i}(\frac{x}{i}+1)}{2} $  ,$ g(x)=[\sum_{d|x} \frac{x}{d}*φ(d)]^2 $

然后接下来的问题就是怎么求f(x)的值和g(x)的前缀和了,求出来就能分段计算辣。

嗯……

想想怎么求……

$ μ(i)*i^2 $ 可以用杜教筛直接求嘛,然后f(x)就可以O(3/4)分段求,可是在总式里面再跑一次分段的话复杂度会……诶,不管了,先写。

g(x)的前缀和可以洲阁筛求,嗯,码码码……(这么复杂的题怎么才7级?

啊,T了,意料之中……

改改改

跑得越来越快了……

诶,极限数据要跑两秒多,可是10组数据的话还是要10多秒

改不动,弃坑……

(51nod群上问了下,夹克老爷说他不会。

问问YJQ

他说$ \sum_{j=1}^i\sum_{k=1}^i [(i,j),(i,k)] $ 这东西是个积性函数。

所以直接用洲阁筛对这个东西求前缀和就好了(掀桌……

也就是说,看到题目,你开始推式子,你就输辣。

具体来说,对于一个质数$ p $,当 $ i=p^k $ 时,$ \sum_{j=1}^i\sum_{k=1}^i [(i,j),(i,k)] =(2k+1)*(p^{2k}-p^{2k-1})+p^{k-1} $

优越写法才2.8k,第一种方法直接上5k……

代码不贴辣。

upd at 2017.4.26好像这题烂大街了,我来发个洲阁筛模板吧

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ui unsigned int
#define ull unsigned long long
#define MN 100001
#define SQ 64000
using namespace std;
ui read_p,read_ca;
inline ui read(){read_p=0;read_ca=getchar();while(read_ca<'0'||read_ca>'9') read_ca=getchar();while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar();return read_p;
}
const ui HA=1e6+7;
ui T,n,MMH,p[MN/10],_p[MN/10],num=0,TTT,O,Num,f[SQ],_S[SQ],G_2[SQ],G_1[SQ],G_0[SQ],_T[SQ],P_P[MN/10],_G_2[MN/10],_G_1[MN/10],_O[SQ],_Num,_l[HA],NNN=0,LL;bool bo[MN];
ui gcd(ui x,ui y){return y?gcd(y,x%y):x;}
ui _b_y[HA],_b_z[HA],_b_ne[HA];
inline void _in(ui x,ui y,ui z){_b_y[++_Num]=y;_b_z[_Num]=z;_b_ne[_Num]=_l[x];_l[x]=_Num;}
inline ui Q_2(ui x){if (x%6==1)return (ull)(x+x+1)*(x+1)/6*x;else if (x%6==4) return (ull)(x+x+1)*x/6*(x+1);else return (ull)x*(x+1)/6*(x+x+1);}
inline ui Q_1(ui x){return (ull)x*(x+1)>>1;}
inline ui sqr(ui x){return x*x;}
inline ui min(ui a,ui b){return a<b?a:b;}
inline ui find(ui x){if (x<HA) return _b_z[_l[x]];register ui i;for (i=_l[x%HA];i;i=_b_ne[i]) if (_b_y[i]==x) return _b_z[i];return 0;
}
inline ui Mmh(ui n){register ui i,j,c;ui o=sqrt(n)+1e-9,MMH=0,k=0,R,Ls,Rs,P,SS=0;ull x,Q,O_O;while (p[LL+1]<=o&&LL<num) LL++;for (i=1;i<=n;i=j+1) j=n/(c=n/i),_S[++k]=c,_in(c%HA,c,k),_T[k]=f[k]=0,G_2[k]=Q_2(c),G_1[k]=Q_1(c),G_0[k]=c;for (i=k,j=0;i;_O[i--]=j) while (_S[i]>=p[j+1]) j++;for (f[i=1]=1,P=Ls=Rs=k;i<=LL;i++){if (i==1) while (_S[P]<_p[i]&&P) P--;else P=Rs;while (_S[Rs]<_p[i+1]&&Rs) SS+=f[Rs--];while (_S[Ls]<p[i+1]&&Ls) SS-=f[Ls--];if (i!=LL) MMH+=SS*P_P[i+1];for (j=P;j;j--)if (f[j]){for (x=p[i],Q=1,c=1;x<=_S[j];x*=p[i],Q*=p[i],c++){R=find(_S[j]/x);f[R]+=(O_O=f[j]*((2*c+1)*(p[i]-1)*sqr(Q)*p[i]+Q));if (Ls>=R&&R>Rs) SS+=O_O;if (i!=LL) if (_S[R]>=p[i+1]&&_S[R]<_p[i+1]) MMH+=O_O*P_P[i+1];}}for (j=1;j<=P;j++)if (_S[j]>=p[i]) c=min(i-1,_O[R=find(_S[j]/p[i])]),G_2[j]-=_p[i]*(G_2[R]-(_G_2[c]-_G_2[_T[R]]))+(_G_2[i-1]-_G_2[_T[j]]),G_1[j]-=p[i]*(G_1[R]-(_G_1[c]-_G_1[_T[R]]))+(_G_1[i-1]-_G_1[_T[j]]),G_0[j]-=(G_0[R]-(c-_T[R]))+(i-1-_T[j]),_T[j]=i;}for (j=1;j<=k;j++) c=min(LL,_O[j]),G_2[j]-=_G_2[c]-_G_2[_T[j]],G_1[j]-=_G_1[c]-_G_1[_T[j]],G_0[j]-=c-_T[j];for (i=1;i<=k;i++) MMH+=f[i]*((G_2[i]-G_1[i])*3+G_0[i]),_l[_S[k]%HA]=0;return _Num=0,MMH;
}
int main(){register ui i,j;for (i=2;i<MN;i++){if (!bo[i]) p[++num]=i,_p[num]=p[num]*p[num],_G_2[num]=_G_2[num-1]+_p[num],_G_1[num]=_G_1[num-1]+p[num],P_P[num]=3*p[num]*(p[num]-1)+1;for (j=1;j<=num&&(O=i*p[j])<MN;j++){bo[O]=1;if (!i%p[j]) break;}}T=read();while(T--){n=read();printf("%u\n",Mmh(n));}
}

View Code

转载于:https://www.cnblogs.com/Enceladus/p/5821862.html

51nod 1575 Gcd and Lcm相关推荐

  1. 1575 Gcd and Lcm

    1575 Gcd and Lcm ∑i=1n∑j=1i∑k=1ilcm(gcd(i,j),gcd(i,k))设f(n)=∑i=1n∑j=1nlcm(gcd(i,n),gcd(j,n))f(p)=3p2 ...

  2. 数论(一)——素数,GCD,LCM

    这是一个数论系列:) 一.素数 ×费马小定理 Theorem: 设 p 是一个素数,a 是一个整数且不是 p 的倍数,那么 很遗憾,费马小定理的逆定理是不成立的.对 a = 2,满足的非素数 n 是存 ...

  3. hdu-4497 GCD and LCM

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4497 题目大意: 给出三个数的gcd和lcm,求出这三个数有多少种可能性 解题思路: 设lcm / ...

  4. 已知gcd和lcm求a+b最小和?------数论

    题意 给出2个数a,b的 gcd(最大公约数n) 和 lcm(最小公倍数m),求所有符合条件的a,b中, 的最小 值. 思路 暴力枚举.根据 gcd(a,b)lcm(a,b)=ab 我们可以得到 ab ...

  5. GCD and LCM Aizu - 0005(辗转相除)+GCD LCM Inverse POJ - 2429(java或【Miller Rabin素数測试】+【Pollar Rho整数分解】)

    题目:GCD and LCM Aizu - 0005 Write a program which computes the greatest common divisor (GCD) and the ...

  6. 【dfs】GCD与LCM(jzoj 1608)

    GCD与LCM 题目大意: 给出a,b的最大公因数和最小公倍数,求出符合条件的a,b的最小差值 样例输入 6 36 样例输出 6 数据范围限制 提示 数据说明: 对于50%的数据,1<=a< ...

  7. YTU 3795 GCD 和 LCM

    题目描述 编写一个程序,计算给定 aaa 和 bbb 的最大公约数 (GCD) 和最小公倍数 (LCM) . 0<a,b≤ 20000000000 lcm(a,b)≤2000000000 数据集 ...

  8. 【备战蓝桥】JavaB组算法小讲解——GCD和LCM

    大家好,这里是祁十一!今天为大家整理了一下GCD和LCM的内容. 目录 一.GCD(最大公约数) 1.定义 2.性质 3.代码实现 <1>Java自带函数 <2>辗转相除法 二 ...

  9. C. Orac and LCM(gcd与lcm的性质)

    Problem - 1350C - Codeforces 题意: 对于正整数的多集合s={s1,s2,...,sk},定义s的最大公除数(GCD)和最小公倍数(LCM)如下. gcd(s)是最大的正整 ...

最新文章

  1. 在同一台电脑上同时使用IE6和IE7
  2. python写文件读文件-python(文件读写)
  3. C语言 · 矩阵乘法
  4. 为什么每次关机都要关闭mysql_在机器关机时关闭mysql服务实例
  5. Linux 上的最佳 C/C++ IDE
  6. JZOJ 3600. 【CQOI2014】通配符匹配
  7. 浅谈如何更好的打开和关闭ADO.NET连接池
  8. 开放下载!《AliOS Things快速开发指南》
  9. python Modbus基础
  10. jenkins 命令行 CLI jenkins-cli.jar
  11. Win7和Ubuntu14.10双系统
  12. 编写程序模拟“主人”喂养“宠物”的场景,利用多态的思想!!!
  13. cognos的HTMl显示,cognos利用html项目和提示元素结合
  14. [转载] java中接口(interface)详解
  15. python基础:os.path的相关操作
  16. 二叉树的递归与非递归
  17. FLUENT边界条件和计算模型
  18. 迁移学习Transfer Learning
  19. http://www.jetbrains.com/ 登不上
  20. 英语3500词(十二)Easter主题(2022.1.24)

热门文章

  1. cisco router修改mac
  2. BeanUtils注意事项
  3. Spring整合mybatis 1 查询
  4. kafka使用_kafka使用Interceptors实现消息端到端跟踪
  5. ReactNative-触摸事件
  6. 数据清洗---占据了数据分析师80%的时间
  7. 手机使用python操作图片文件
  8. nodejs代码细节效率对比
  9. [转] getBoundingClientRect判断元素是否可见
  10. Apollo 10 — adminService 全量发布