1040 最大公约数之和

  给出一个n,求1-n这n个数,同n的最大公约数的和。比如:n = 6时,1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15

  看起来很简单对吧,但是n<=1e9,所以暴力是不行的,所以要把公式进行推导。

  引用51nod1040最大公约数之和(欧拉函数)

  

  这个自己上手推一下也很好推的,不过没推过公式的可能不太懂。

 #include<cstdio>
#include<cmath>
typedef long long ll;
const int N=;
bool nop[N]={false};
int pn,pri[N];
void init()
{
pn=;
for(int i=;i<N;i++)
{
if(!nop[i])
pri[pn++]=i;
for(int j=;j<pn&&1ll*i*pri[j]<N;j++)
{
nop[i*pri[j]]=true;
if(i%pri[j]==)
break;
}
}
}
int phi(int x)
{
int ans=x;
for(int i=;i<pn&&pri[i]*pri[i]<=x;i++)
if(x%pri[i]==)
{
ans=ans-ans/pri[i];
while(x%pri[i]==)
x/=pri[i];
}
if(x>)
ans=ans-ans/x;
return ans;
}
ll solve(int x)
{
ll ans=;
int xx=sqrt(x);
for(int i=;i<=xx;i++)
{
if(x%i==)
{
ans+=i*phi(x/i);
if(x/i!=i)
ans+=x/i*phi(i);
}
}
return ans;
}
int main()
{
int n;
init();
while(~scanf("%d",&n))
printf("%lld\n",solve(n));
return ;
}

欧拉函数

  另一个方法就是首先可以观察看出f(n)=∑gcd(i,n)是积性函数的性质(不懂证明),然后借用积性函数的性质

  

  这样要求f(n),我们只需要知道f(pk)等于多少就行了,而f(pk)的话

  

  而不懂怎么化简成最后一步的话,直接跑第一步的式子也行,因为pk它的因子也不会有多少个

 #include<cstdio>
#include<cmath>
typedef long long ll;
const int N=;
bool nop[N]={false};
int pn,pri[N];
void init()
{
pn=;
for(int i=;i<N;i++)
{
if(!nop[i])
pri[pn++]=i;
for(int j=;j<pn&&1ll*i*pri[j]<N;j++)
{
nop[i*pri[j]]=true;
if(i%pri[j]==)
break;
}
}
}
int phi(int x)
{
int ans=x;
for(int i=;i<pn&&pri[i]*pri[i]<=x;i++)
if(x%pri[i]==)
{
ans=ans-ans/pri[i];
while(x%pri[i]==)
x/=pri[i];
}
if(x>)
ans=ans-ans/x;
return ans;
}
//不化简
//ll solve(int x)
//{
// ll ans=1,res;
// for(int i=0;i<pn&&pri[i]<=x;i++)
// {
// if(x%pri[i]==0)
// {
// int y=1,z,num=0;
// res=0;
// while(x%pri[i]==0)
// {
// x/=pri[i];
// y*=pri[i];
// }
// z=y;
// while(z)
// {
// res+=1ll*(y/z-num)*z;
// num=y/z;
// z/=pri[i];
// }
// ans*=res;
// }
// }
// if(x>1)
// ans*=2ll*x-1;
// return ans;
//}
ll solve(int x)
{
ll ans=;
int xx=sqrt(x);
for(int i=;i<=xx;i++)
{
if(x%i==)
{
ans+=i*phi(x/i);
if(x/i!=i)
ans+=x/i*phi(i);
}
}
return ans;
}
int main()
{
int n;
init();
while(~scanf("%d",&n))
printf("%lld\n",solve(n));
return ;
}

自己瞎搞

最新文章

  1. 工作中常用的js、jquery自定义扩展函数代码片段
  2. Thinkphp各大支付平台在线支付集成源码
  3. 数据结构算法C语言实现(十七)--- 5.1&amp;5.2数组:定义、顺序表示及实现
  4. mac下sublime text3安装SFTP及使用
  5. Viewpager图片自动轮播,网络图片加载,图片自动刷新
  6. Textures
  7. 【转载自友盟消息推送iOS文档】在appDelegate中注册推送
  8. Oracle EBS-SQL (MRP-7):检查MRP计划运行报错原因之超大数据查询2.sql
  9. 关于asp.net 的一些好资料地址 , 防止丢失!
  10. Mysql rr和rc隔离
  11. ARM应用调试思路、方法总结、笔记
  12. YAML 在Python中的配置应用
  13. 面试之路(27)-链表中倒数第K个结点
  14. (线性DP LIS)POJ2533 Longest Ordered Subsequence
  15. 3D Slicer Modify Mouse Event 修改3D Slicer中的鼠标响应事件
  16. 【转】一张图解析FastAdmin中的表格列表的功能
  17. delphi android路径 TPath 文件路径,文件管理
  18. ArgumentException: 已添加了具有相同键的项。
  19. Mybatis批量更新报错com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException
  20. ldap安装配置过程中遇到的错误,以及解决方法

热门文章

  1. CSS实现单选按钮
  2. hdu 6082 2017百度之星资格赛
  3. MyEclipse eclipse console edit packageExplorer 颜色设置、个性化、常用设置
  4. C调用C++(C++封装以及C对其调用)
  5. ffmpeg源码分析之媒体打开过程
  6. Socket的神秘面纱
  7. Java后端开发常用工具
  8. python 把函数的值赋给变量
  9. 前端基础(九):SweetAlert(弹出框)
  10. 每日命令:(7)mv