做题重心转移到 LOJ 了。

至于为什么,如果你知道“……”的密码,就去看吧。

LOJ 上用户自创题大多数都不可做,今天看到个可做题(而且还是个水题),就来做了一发。


明显枚举立方根。(以下令 $m=\lfloor\sqrt[3]{n}\rfloor$)

$$\sum\limits_{i=1}^m\sum\limits_{j=i^3}^{\min(n,(i+1)^3-1)}\gcd(i,j)$$

由于 $i=m$ 比较特殊,我们把它拎出来:(其实就是把 $\min$ 拆开)

$$\sum\limits_{i=1}^{m-1}\sum\limits_{j=i^3}^{(i+1)^3-1}\gcd(i,j)+\sum_{j=m^3}^n\gcd(m,j)$$

现在考虑 $\sum\limits_{i=1}^n\gcd(x,i)$ 怎么求。

$$\sum\limits_{i=1}^n\sum\limits_{d|(x,i)}\varphi(d)$$

$$\sum\limits_{d|x}\varphi(d)\lfloor\frac{n}{d}\rfloor$$

那么套回去:

$$\sum\limits_{i=1}^{m-1}\sum\limits_{d|i}\varphi(d)(\lfloor\frac{(i+1)^3-1}{d}\rfloor-\lfloor\frac{i^3-1}{d}\rfloor)+\sum\limits_{d|m}\varphi(d)(\lfloor\frac{n}{d}\rfloor-\lfloor\frac{m^3-1}{d}\rfloor)$$

后面那部分可以直接枚举因数,暴力求欧拉函数。我这里预处理了前 $10^7\approx m^{\frac{2}{3}}$ 个欧拉函数,时间复杂度是远远小于 $O(m^{\frac{2}{3}})$ 的。

接下来继续推前面的:

$$\sum\limits_{i=1}^{m-1}\sum\limits_{d|i}\varphi(d)(\lfloor\frac{(i+1)^3-1}{d}\rfloor-\lfloor\frac{i^3-1}{d}\rfloor)$$

$$\sum\limits_{d=1}^{m-1}\varphi(d)\sum\limits_{i=1}^{\lfloor\frac{m-1}{d}\rfloor}(\lfloor\frac{(id+1)^3-1}{d}\rfloor-\lfloor\frac{(id)^3-1}{d}\rfloor)$$

$$\sum\limits_{d=1}^{m-1}\varphi(d)\sum\limits_{i=1}^{\lfloor\frac{m-1}{d}\rfloor}(\lfloor\frac{(id)^3+3(id)^2+3(id)}{d}\rfloor-\lfloor\frac{(id)^3-1}{d}\rfloor)$$

$$\sum\limits_{d=1}^{m-1}\varphi(d)\sum\limits_{i=1}^{\lfloor\frac{m-1}{d}\rfloor}((i^3d^2+3i^2d+3i)-(\lfloor i^3d^2-\frac{1}{d}\rfloor))$$

$$\sum\limits_{d=1}^{m-1}\varphi(d)\sum\limits_{i=1}^{\lfloor\frac{m-1}{d}\rfloor}((i^3d^2+3i^2d+3i)-(i^3d^2-1))$$

$$\sum\limits_{d=1}^{m-1}\varphi(d)\sum\limits_{i=1}^{\lfloor\frac{m-1}{d}\rfloor}(3i^2d+3i+1)$$

$$\sum\limits_{d=1}^{m-1}d\varphi(d)\sum\limits_{i=1}^{\lfloor\frac{m-1}{d}\rfloor}3i^2+\sum\limits_{d=1}^{m-1}\varphi(d)\sum\limits_{i=1}^{\lfloor\frac{m-1}{d}\rfloor}(3i+1)$$

分块杜教筛即可。

时间复杂度:由于每次分块杜教筛都跑得过 $10^{10}$,我就姑且当它是 $O(m^{\frac{2}{3}})$ 的。所以时间复杂度 $O(n^{\frac{2}{9}})$。

upd: 已经会证复杂度是 $O(m^{\frac{2}{3}})$ 了。如果用 map 是可以做到这个复杂度(忽略那个 $\log$ 啦),但如果用其他什么奇怪的记忆化方法复杂度可能退化到 $O(m^{\frac{5}{6}})$。

代码很丑。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef __int128 lll;
  5. const int maxn=,mod=,inv6=;
  6. #define FOR(i,a,b) for(int i=(a);i<=(b);i++)
  7. #define ROF(i,a,b) for(int i=(a);i>=(b);i--)
  8. #define MEM(x,v) memset(x,v,sizeof(x))
  9. inline lll read(){
  10. char ch=getchar();lll x=,f=;
  11. while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
  12. while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
  13. return f?-x:x;
  14. }
  15. lll n,nn;
  16. int pr[maxn],pl,phi[maxn],pre1[maxn],pre2[maxn],ans;
  17. bool vis[maxn];
  18. map<ll,int> p1,p2;
  19. ll cb,cb1;
  20. void init(int upr){
  21. phi[]=;
  22. FOR(i,,upr){
  23. if(!vis[i]) phi[pr[++pl]=i]=i-;
  24. FOR(j,,pl){
  25. if(i*pr[j]>upr) break;
  26. vis[i*pr[j]]=true;
  27. if(i%pr[j]) phi[i*pr[j]]=phi[i]*(pr[j]-);
  28. else{
  29. phi[i*pr[j]]=phi[i]*pr[j];break;
  30. }
  31. }
  32. }
  33. pre1[]=pre2[]=;
  34. FOR(i,,upr){
  35. pre1[i]=(pre1[i-]+phi[i])%mod;
  36. pre2[i]=(pre2[i-]+1ll*phi[i]*i)%mod;
  37. }
  38. }
  39. int s1(ll n){
  40. int nn=n%mod;
  41. return 1ll*nn*(nn+)/%mod;
  42. }
  43. int s1(ll l,ll r){return (s1(r)-s1(l-)+mod)%mod;}
  44. int s2(ll n){
  45. int nn=n%mod;
  46. return 1ll*nn*(nn+)%mod*(*nn+)%mod*inv6%mod;
  47. }
  48. int s2(ll l,ll r){return (s2(r)-s2(l-)+mod)%mod;}
  49. int S1(ll n){
  50. if(n<=) return pre1[n];
  51. if(p1.count(n)) return p1[n];
  52. int nn=n%mod,s=1ll*nn*(nn+)/%mod;
  53. for(ll l=,r;l<=n;l=r+){
  54. r=n/(n/l);
  55. s=(s-1ll*(r-l+)%mod*S1(n/l)%mod+mod)%mod;
  56. }
  57. return p1[n]=s;
  58. }
  59. int S2(ll n){
  60. if(n<=) return pre2[n];
  61. if(p2.count(n)) return p2[n];
  62. int nn=n%mod,s=1ll*nn*(nn+)%mod*(*nn+)%mod*inv6%mod;
  63. for(ll l=,r;l<=n;l=r+){
  64. r=n/(n/l);
  65. s=(s-1ll*s1(l,r)*S2(n/l)%mod+mod)%mod;
  66. }
  67. return p2[n]=s;
  68. }
  69. int calc_phi(ll n){
  70. if(n<=) return phi[n];
  71. ll s=n;
  72. for(ll i=;i*i<=n;i++) if(n%i==){
  73. s=s/i*(i-);
  74. while(n%i==) n/=i;
  75. }
  76. if(n>) s=s/n*(n-);
  77. return s%mod;
  78. }
  79. int calc(ll x){
  80. int s=;
  81. for(ll i=;i*i<=x;i++) if(x%i==){
  82. s=(s+1ll*calc_phi(i)*((n/i)%mod-(nn/i)%mod+mod)%mod)%mod;
  83. if(i*i!=x) s=(s+1ll*calc_phi(x/i)*((n/(x/i))%mod-(nn/(x/i))%mod+mod)%mod)%mod;
  84. }
  85. return s;
  86. }
  87. int main(){
  88. n=read();
  89. cb=pow(n,1.0/);cb1=cb-;
  90. nn=(lll)cb*cb*cb-;
  91. init(min(cb,10000000ll));
  92. for(ll l=,r;l<=cb1;l=r+){
  93. r=cb1/(cb1/l);
  94. ans=(ans+3ll*s2(,cb1/l)*(S2(r)-S2(l-)+mod)%mod+(3ll*s1(,cb1/l)+cb1/l)%mod*(S1(r)-S1(l-)+mod)%mod)%mod;
  95. }
  96. printf("%d\n",(ans+calc(cb))%mod);
  97. }

upd:

被出题人针对着卡,结果真卡掉了……

其实是开立方根出精度问题了,改一改就好了。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef __int128 lll;
  5. const int maxn=,mod=,inv6=;
  6. #define FOR(i,a,b) for(int i=(a);i<=(b);i++)
  7. #define ROF(i,a,b) for(int i=(a);i>=(b);i--)
  8. #define MEM(x,v) memset(x,v,sizeof(x))
  9. inline lll read(){
  10. char ch=getchar();lll x=,f=;
  11. while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
  12. while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
  13. return f?-x:x;
  14. }
  15. lll n,nn;
  16. int pr[maxn],pl,phi[maxn],pre1[maxn],pre2[maxn],ans;
  17. bool vis[maxn];
  18. map<ll,int> p1,p2;
  19. ll cb,cb1;
  20. void init(int upr){
  21. phi[]=;
  22. FOR(i,,upr){
  23. if(!vis[i]) phi[pr[++pl]=i]=i-;
  24. FOR(j,,pl){
  25. if(i*pr[j]>upr) break;
  26. vis[i*pr[j]]=true;
  27. if(i%pr[j]) phi[i*pr[j]]=phi[i]*(pr[j]-);
  28. else{
  29. phi[i*pr[j]]=phi[i]*pr[j];break;
  30. }
  31. }
  32. }
  33. pre1[]=pre2[]=;
  34. FOR(i,,upr){
  35. pre1[i]=(pre1[i-]+phi[i])%mod;
  36. pre2[i]=(pre2[i-]+1ll*phi[i]*i)%mod;
  37. }
  38. }
  39. int s1(ll n){
  40. int nn=n%mod;
  41. return 1ll*nn*(nn+)/%mod;
  42. }
  43. int s1(ll l,ll r){return (s1(r)-s1(l-)+mod)%mod;}
  44. int s2(ll n){
  45. int nn=n%mod;
  46. return 1ll*nn*(nn+)%mod*(*nn+)%mod*inv6%mod;
  47. }
  48. int s2(ll l,ll r){return (s2(r)-s2(l-)+mod)%mod;}
  49. int S1(ll n){
  50. if(n<=) return pre1[n];
  51. if(p1.count(n)) return p1[n];
  52. int nn=n%mod,s=1ll*nn*(nn+)/%mod;
  53. for(ll l=,r;l<=n;l=r+){
  54. r=n/(n/l);
  55. s=(s-1ll*(r-l+)%mod*S1(n/l)%mod+mod)%mod;
  56. }
  57. return p1[n]=s;
  58. }
  59. int S2(ll n){
  60. if(n<=) return pre2[n];
  61. if(p2.count(n)) return p2[n];
  62. int nn=n%mod,s=1ll*nn*(nn+)%mod*(*nn+)%mod*inv6%mod;
  63. for(ll l=,r;l<=n;l=r+){
  64. r=n/(n/l);
  65. s=(s-1ll*s1(l,r)*S2(n/l)%mod+mod)%mod;
  66. }
  67. return p2[n]=s;
  68. }
  69. int calc_phi(ll n){
  70. if(n<=) return phi[n];
  71. ll s=n;
  72. for(ll i=;i*i<=n;i++) if(n%i==){
  73. s=s/i*(i-);
  74. while(n%i==) n/=i;
  75. }
  76. if(n>) s=s/n*(n-);
  77. return s%mod;
  78. }
  79. int calc(ll x){
  80. int s=;
  81. for(ll i=;i*i<=x;i++) if(x%i==){
  82. s=(s+1ll*calc_phi(i)*((n/i)%mod-(nn/i)%mod+mod)%mod)%mod;
  83. if(i*i!=x) s=(s+1ll*calc_phi(x/i)*((n/(x/i))%mod-(nn/(x/i))%mod+mod)%mod)%mod;
  84. }
  85. return s;
  86. }
  87. int main(){
  88. n=read();
  89. cb=pow(n,1.0/);
  90. while((lll)cb*cb*cb<=n) cb++;
  91. while((lll)cb*cb*cb>n) cb--;
  92. cb1=cb-;
  93. nn=(lll)cb*cb*cb-;
  94. init(min(cb,10000000ll));
  95. for(ll l=,r;l<=cb1;l=r+){
  96. r=cb1/(cb1/l);
  97. ans=(ans+3ll*s2(,cb1/l)*(S2(r)-S2(l-)+mod)%mod+(3ll*s1(,cb1/l)+cb1/l)%mod*(S1(r)-S1(l-)+mod)%mod)%mod;
  98. }
  99. printf("%d\n",(ans+calc(cb))%mod);
  100. }

LOJ6686 Stupid GCD(数论,欧拉函数,杜教筛)的更多相关文章

  1. BZOJ4916 神犇和蒟蒻(欧拉函数+杜教筛)

    第一问是来搞笑的.由欧拉函数的计算公式容易发现φ(i2)=iφ(i).那么可以发现φ(n2)*id(n)(此处为卷积)=Σd*φ(d)*(n/d)=nΣφ(d)=n2 .这样就有了杜教筛所要求的容易算 ...

  2. BZOJ4916 神犇和蒟蒻 【欧拉函数 + 杜教筛】

    题目 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; 输入格式 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; 输出格式 请你输出一个整数A=\sum ...

  3. 51nod 1238 最小公倍数之和 V3 【欧拉函数+杜教筛】

    首先题目中给出的代码打错了,少了个等于号,应该是 G=0; for(i=1;i<=N;i++) for(j=1;j<=N;j++) { G = (G + lcm(i,j)) % 10000 ...

  4. bzoj 3944: Sum【莫比乌斯函数+欧拉函数+杜教筛】

    一道杜教筛的板子题. 两个都是积性函数,所以做法是一样的.以mu为例,设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1} ...

  5. 51nod 1227 平均最小公倍数【欧拉函数+杜教筛】

    以后这种题能用phi的就不要用mu-mu往往会带着个ln然后被卡常致死 把题目要求转换为前缀和相减的形式,写出来大概是要求这样一个式子: \[ \sum_{i=1}^{n}\sum_{j=1}^{i} ...

  6. 51nod 1239 欧拉函数之和【欧拉函数+杜教筛】

    和bzoj 3944比较像,但是时间卡的更死 设\( f(n)=\sum_{d|n}\phi(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\phi(i) ...

  7. 【luogu3768】简单的数学题 欧拉函数(欧拉反演)+杜教筛

    题目描述 给出 $n$ 和 $p$ ,求 $(\sum\limits_{i=1}^n\sum\limits_{j=1}^nij\gcd(i,j))\mod p$ . $n\le 10^{10}$ . ...

  8. bzoj 2818 GCD 数论 欧拉函数

    bzoj[2818]Gcd Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Samp ...

  9. BZOJ-2190 仪仗队 数论+欧拉函数(线性筛)

    今天zky学长讲数论,上午水,舒爽的不行..后来下午直接while(true){懵逼:}死循全程懵逼....(可怕)Thinking Bear. 2190: [SDOI2008]仪仗队 Time Li ...

  10. 【bzoj2818】: Gcd 数论-欧拉函数

    [bzoj2818]: Gcd 考虑素数p<=n gcd(xp,yp)=p 当 gcd(x,y)=1 xp,yp<=n满足条件 p对答案的贡献: 预处理前缀和就好了 /* http://w ...

随机推荐

  1. (四十二)golang--协程之间通信的方式

    假设我们现在有这么一个需求: 计算1-200之间各个数的阶乘,并将每个结果保存在mao中,最终显示出来,要求使用goroutime. 分析: (1)使用goroutime完成,效率高,但是会出现并发/ ...

  2. 浅谈javascript引擎执行代码的步骤-(2019-2)

    平时面试经常会遇到类似下面的这种题,而且千变万化,让人一个头两个.示例这道题算是稍微有点难度的了,这种题考查的是JavaScript引擎执行代码的步骤. b = 'cba'; function a(a ...

  3. Springboot概述

    目录 什么是springboot Springboot的优点 SpringBoot的缺点 一:什么是springboot Springboot是Spring开源组织下的子项目,是Spring组件一站式 ...

  4. HttpListener 实现小型web服务器

    HttpListener 实现web服务器 用于小型服务器,简单.方便.不需要部署. 总共代码量不超过50行. static void Main(string[] args) { //创建HTTP监听 ...

  5. Python - 数据结构 - 第十五天

    Python 数据结构 本章节我们主要结合前面所学的知识点来介绍Python数据结构. 列表 Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和 ...

  6. C typedef、#define

    参考链接:https://www.runoob.com/cprogramming/c-typedef.html 作用 typedef是用来为数据类型(可以是各种数据类型,包括自己定义的数据类型如结构体 ...

  7. .Net捕获网站异常信息记录操作日志

    第一步:在Global.asax文件下的Application_Error()中写入操作日志 /// <summary> /// 整个网站出现异常信息,都会执行此方法 /// </s ...

  8. 手写instanceof (详解原型链) 和 实现绑定解绑和派发的事件类

    A  instanceof  B    是判断  A  是否继承自B,是返回true,  否返回false 再精确点就是判断B   是否  再  A  的 原型链上, 什么是原型链,举个例子: 我们定 ...

  9. 如何在linux CentOS 上安装chrome 谷歌浏览器?

    获得linux命令的root权限:http://blog.csdn.net/mddy2001/article/details/76521101. 更改密码在终端中输入:sudo passwd root ...

  10. 从未被Google过 #NerverBeenGoogled

    我相信大家都用Google搜索互联网上的东西,Google会跟踪你搜索的所有内容,但是你或许不知道,他们也记录着从未被Google过的内容.我有个清单,这些是有史以来从未被Google过的一些东西1. ...