直接两重循环O(n^2)算gcd……未免太耗时

枚举因数a和a的倍数n,考虑gcd(i,n)==a的i数量(i<=n)

由于gcd(i,n)==a等价于gcd(i/a,n/a)==1,所以满足gcd(i,n)==a的数有phi[n/a]个

打出欧拉函数表,枚举因数,计算出每个n的f[n]=gcd(1,n)+gcd(2,n)+gcd(3,n)+...+gcd(n-1,n)

然后求f[n]的前缀和,回答询问。

 /*by SilverN*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int pri[mxn],cnt=;
long long phi[mxn],f[mxn];
void PHI(){
for(int i=;i<mxn;i++){
if(!phi[i]){
phi[i]=i-;
pri[++cnt]=i;
}
for(int j=;j<=cnt && (long long)i*pri[j]<mxn;j++){
if(i%pri[j]==){
phi[i*pri[j]]=phi[i]*pri[j];
break;
}
else phi[i*pri[j]]=phi[i]*(pri[j]-);
}
}
return;
}
int main(){
PHI();
int i,j;
for(i=;i<mxn;i++){//枚举因数
for(j=i*;j<mxn;j+=i){
f[j]+=i*phi[j/i];
}
}
for(i=;i<mxn;i++)f[i]+=f[i-];
while(){
i=read();
if(!i)break;
printf("%lld\n",f[i]);
}
return ;
}

最新文章

  1. dll 日志文件 放在同一个目录。
  2. MVC4研发中遇到问题【持续总结....】
  3. C#以及Oracle中的上取整、下取整方法
  4. dell inspiorn 14vr 1616b ubuntu 无线网卡的问题
  5. 11_Jaxws常用注解
  6. C++Primer第5版学习笔记(三)
  7. 动态规划(斜率优化):SPOJ Commando
  8. HDOJ(HDU) 2083 简易版之最短距离(中位数)
  9. DataTable转换成List
  10. jquery .net 无刷新多文件上传
  11. 【Android 错误记录】Conversion to Dalvik format failed with error 1 错误
  12. 如何改变c盘的访问权限
  13. NET开发者部署React-Native
  14. Floodlight Controller 路线原则
  15. JavaEE(1) - Weblogic 服务器管理的数据源
  16. splinter web测试框架
  17. iOS 8 中如何集成 Touch ID 功能
  18. Android 修改包名,导致安装错误
  19. SQLServer 中有五种约束, Primary Key 约束、 Foreign Key 约束、 Unique 约束、 Default 约束和 Check 约束
  20. Postgresql的隐藏系统列

热门文章

  1. AddDbContext was called with configuration, but the context type &#39;NewsContext&#39; only declares a parameterless constructor?
  2. 01_8_Struts用DomainModel接收参数
  3. Unity3d 中键值监听方法
  4. Yii2应用的运行过程
  5. jenkins+svn+pipeline+kubernetes部署java应用(一)
  6. Thinkphp5 同时连接两个库
  7. yield关键字有什么作用
  8. SQL语句小练习
  9. hbase问题总结
  10. python基础学习笔记—— 多继承