gcd(x,y)(1<=x,y<=n)为素数(暂且把(x,y)和(y,x)算一种) 的个数

<=> gcd(x/k,y/k)=1,k是x的质因数 的个数

<=> Σφ(x/k) (1<=x<=n,k是x的质因子)

这样的复杂度无法接受,

∴我们可以考虑枚举k,计算Σφ(q/k) (k是n以内的质数,q是n以内k的倍数),即Σ[φ(1)+φ(2)+φ(3)+...+φ(p)] (p=n/k)

介个phi的前缀和可以预处理粗来。

但是(x,y)和(y,x)并不同,所以在计算前缀和的时候,对于φ(x) (x≠1),要乘2再累加,即Σ[φ(1)+φ(2)*2+φ(3)*2+...+φ(p)*2] (p=n/k)。

∴对每个n以内的素数,我们可以O(1)地得到其对答案的贡献。

∴时间复杂度花费在筛素数和预处理phi上,为O(n*log(log(n)))或O(n)[线性筛]。

 #include<cstdio>
using namespace std;
typedef long long ll;
int phi[],n;
bool unPrime[];
ll ans,sum[];
void Shai_Prime()
{
unPrime[]=;
for(ll i=;i<=n;i++) if(!unPrime[i])
{
ans+=sum[n/i];
for(ll j=i*i;j<=n;j+=i)
unPrime[j]=;
}
}
void phi_table()
{
phi[]=;//规定phi(1)=1;
for(int i=;i<=n;i++)
if(!phi[i])//若i是质数(类似筛法的思想)
for(int j=i;j<=n;j+=i)//i一定是j的质因数
{
if(!phi[j]) phi[j]=j;
phi[j]=phi[j]/i*(i-);
}
}
void init_sum()
{
sum[]=phi[];
for(int i=;i<=n;i++) sum[i]=(ll)(phi[i]<<)+sum[i-];
}
int main()
{
scanf("%d",&n); phi_table(); init_sum(); Shai_Prime();
printf("%lld\n",ans);
return ;
}

最新文章

  1. 【读fastclick源码有感】彻底解决tap“点透”,提升移动端点击响应速度
  2. Android之listview &amp;&amp; adapter
  3. HDOJ 1422 重温世界杯 -- 动态规划
  4. 读《编写高质量代码:改善JavaScript程序的188个建议》1
  5. 模板--&gt;求逆矩阵(利用初等变换求解)
  6. opencv 中cvZero()的使用
  7. Jquery多级菜单插件Slimmenu使用说明
  8. java byte【】数组与文件读写
  9. C# Task 源代码(2)
  10. Redis数据结构之intset
  11. Centos7常用操作
  12. Android 利用二次贝塞尔曲线模仿购物车加入物品抛物线动画
  13. Java连接数据库 #01# JDBC单线程适用
  14. Adobe photoshop CS5(32位and64位)破解补丁
  15. JNI探秘-----FileInputStream的read方法详解
  16. php分享十五:php的命令行操作
  17. HTML(四):行级标签和块级标签
  18. react-router实现tab页面切换,并解决选中样式首页始终选中问题
  19. [py]python的继承体系-源码目录结构
  20. CHAPTER 40 Science in Our Digital Age 第40章 我们数字时代的科学

热门文章

  1. 转:Linux下使用Nginx搭建简单图片服务器
  2. Sequence(ST表)(洛谷P2048)
  3. bzoj 1951 lucas crt 费马小定理
  4. bzoj 1005 组合数学 Purfer Sequence
  5. Django-内置Admin
  6. POJ1080(LCS变形)
  7. 安全测试===BurpSuite使用教程-附安装包
  8. HTTP===如何理解网关
  9. TortoiseSVN与VisualSVN Server搭建SVN版本控制系统【转】
  10. js实现的联想输入