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 ;
}

自己瞎搞

51nod1040 最大公约数之和,欧拉函数或积性函数的更多相关文章

  1. 牛客小白月赛12-C(欧拉筛解积性方程)

    题目链接:https://ac.nowcoder.com/acm/contest/392/C 题意:给定n,求: 思路:令res[i]=iN  (%MOD),因为xn是一个积性函数,即(x*y)n=x ...

  2. 51nod 1040 最大公约数之和 欧拉函数

    1040 最大公约数之和 题目连接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1040 Description 给 ...

  3. HDU 6390 GuGuFishtion(莫比乌斯反演 + 欧拉函数性质 + 积性函数)题解

    题意: 给定\(n,m,p\),求 \[\sum_{a=1}^n\sum_{b=1}^m\frac{\varphi(ab)}{\varphi(a)\varphi(b)}\mod p \] 思路: 由欧 ...

  4. 【模板】埃拉托色尼筛法 && 欧拉筛法 && 积性函数

    埃拉托色尼筛法 朴素算法 1 vis[1]=1; 2 for (int i=2;i<=n;i++) 3 if (!vis[i]) 4 { 5 pri[++tot]=i; 6 for (int j ...

  5. poj2480(利用欧拉函数的积性求解)

    题目链接: http://poj.org/problem?id=2480 题意:∑gcd(i, N) 1<=i <=N,就这个公式,给你一个n,让你求sum=gcd(1,n)+gcd(2, ...

  6. POJ 2480 Longge's problem (积性函数,欧拉函数)

    题意:求∑gcd(i,n),1<=i<=n思路:f(n)=∑gcd(i,n),1<=i<=n可以知道,其实f(n)=sum(p*φ(n/p)),其中p是n的因子.为什么呢?原因 ...

  7. 积性函数初步(欧拉$\varphi$函数)

    updata on 2020.4.3 添加了欧拉\(\varphi\)函数为积性函数的证明和它的计算方式 1.积性函数 设\(f(n)\)为定义在正整数上的函数,若\(f(1)=1\),且对于任意正整 ...

  8. 积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和

    只会搬运YL巨巨的博客 积性函数 定义 积性函数:对于任意互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数. 完全积性函数:对于任意整数a和b有性质f(ab)=f(a)f(b)的数论函数 ...

  9. Divisor counting [线性筛积性函数]

    Divisor counting 题目大意:定义f(n)表示整数n的约数个数.给出正整数n,求f(1)+f(2)+...+f(n)的值. 注释:1<=n<=1000,000 想法:我们再次 ...

随机推荐

  1. HTNL基础之四

    11.<nav>导航元素 标签定义及使用说明 表示页面中导航链接的部分,例如:传统导航条,侧边栏导航,页内导航,翻页等 <nav> 标签定义导航链接的部分. 并不是所有的 HT ...

  2. 在win下开发的项目怎么迁移到linux下面才能正常运行?

    我可以直接拷贝项目目录到linux下面直接操作吗? 答案: 可以,咋可能??? 为啥??? win开发直接拷贝过去,你不凉谁凉了,我以前也同样的单纯,如果你项目里用的绝对路径! 那恭喜你,你凉了,清楚 ...

  3. 【Python基础】11_Python中的字符串

    1.字符串的定义 可以使用""双引号,也可以使用''单引号定义字符串,一般使用双引号定义. 2.字符串的操作 判断类型: 查找和替换 大小写切换: 文本对齐 注:string.ce ...

  4. 计算机网络(TCP/IP)

    概述:网络协议通常分不同的层次进行开发,每一层分别不同的通信功能.TCP/IP通常分为4层协议系统. 1.链路层,有时也称为数据链路层或者网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网 ...

  5. 用shell脚本安装MySQL-5.7.22-官方版本多实例

    Install_CentOS7_MySQL57_multi_instance.sh #!/bin/bash #请提前准备好参数文件my.cnf PORT=3307 InitMySQL() { mkdi ...

  6. java中锁的应用

    锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized(重量级) 和 ReentrantLock(轻量级)等等 ) .这些已经写好提供的锁为我们开发提供了便利. ...

  7. JS 验证字符串是否能转为json格式

    var isJSON=function (str) { if (typeof str == 'string') { try { var obj = JSON.parse(str); if (typeo ...

  8. javaIO——PipedReader & PipedWriter

    1. 概述: PipedReader 和 PipedWriter,意为管道读写流.所谓管道,那就是有进有出,所以这也是它们跟其它流对象最显著的区别:PipedReader和PipedWriter必须成 ...

  9. 7.移动端自动化测试-小知识 try...except...finally语句

    异常Error 我们在写代码的时候,经常会遇见程序抛出Error无法执行的情况 一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当Python脚本发 ...

  10. Objective-C 之Extension

    Objective-C 之Extension class extension:类扩展 类扩展与 category 有相似性,但在编译时它只能被添加到已有源代码的一类中(该类扩展和该类同时被编译). 在 ...