51nod1040 最大公约数之和,欧拉函数或积性函数
给出一个n,求1-n这n个数,同n的最大公约数的和。比如:n = 6时,1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15
看起来很简单对吧,但是n<=1e9,所以暴力是不行的,所以要把公式进行推导。

这个自己上手推一下也很好推的,不过没推过公式的可能不太懂。
#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 最大公约数之和,欧拉函数或积性函数的更多相关文章
- 牛客小白月赛12-C(欧拉筛解积性方程)
题目链接:https://ac.nowcoder.com/acm/contest/392/C 题意:给定n,求: 思路:令res[i]=iN (%MOD),因为xn是一个积性函数,即(x*y)n=x ...
- 51nod 1040 最大公约数之和 欧拉函数
1040 最大公约数之和 题目连接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1040 Description 给 ...
- HDU 6390 GuGuFishtion(莫比乌斯反演 + 欧拉函数性质 + 积性函数)题解
题意: 给定\(n,m,p\),求 \[\sum_{a=1}^n\sum_{b=1}^m\frac{\varphi(ab)}{\varphi(a)\varphi(b)}\mod p \] 思路: 由欧 ...
- 【模板】埃拉托色尼筛法 && 欧拉筛法 && 积性函数
埃拉托色尼筛法 朴素算法 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 ...
- poj2480(利用欧拉函数的积性求解)
题目链接: http://poj.org/problem?id=2480 题意:∑gcd(i, N) 1<=i <=N,就这个公式,给你一个n,让你求sum=gcd(1,n)+gcd(2, ...
- 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的因子.为什么呢?原因 ...
- 积性函数初步(欧拉$\varphi$函数)
updata on 2020.4.3 添加了欧拉\(\varphi\)函数为积性函数的证明和它的计算方式 1.积性函数 设\(f(n)\)为定义在正整数上的函数,若\(f(1)=1\),且对于任意正整 ...
- 积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和
只会搬运YL巨巨的博客 积性函数 定义 积性函数:对于任意互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数. 完全积性函数:对于任意整数a和b有性质f(ab)=f(a)f(b)的数论函数 ...
- Divisor counting [线性筛积性函数]
Divisor counting 题目大意:定义f(n)表示整数n的约数个数.给出正整数n,求f(1)+f(2)+...+f(n)的值. 注释:1<=n<=1000,000 想法:我们再次 ...
随机推荐
- POJ 1015 Jury Compromise (记录路径的背包问题)
(点击此处查看原题) 题意 为了审判某一个人,需要在n个人当中选出m个人组成陪审团,n个人中每个人都有作为起诉方的价值p和作为辩护方的价值d,为了保证公平性,要求m个人作为起诉方的价值之和P和作为辩护 ...
- swiper手滑动轮播图后自动轮播失效解决办法
设置autoplay:true之后,再设置 autoplay:{disableOnInteraction: false} --------------------------------------- ...
- Tkinter(一)
采集小工具,目前采集主要针对知乎文章与评论,今天刚开始弄,会不断更新完善 目前效果(测试站点 :科技:测试连接:http://zhihu.sogou.com/include/pc/pc/topic/t ...
- ORACLE和SQL查询库数据量
ORACLE根据账号查询每张表数据量: select t.table_name,t.num_rows from user_tables t ORDER BY NUM_ROWS DESC; SQL SE ...
- 如何远程调试部署在CloudFoundry平台上的nodejs应用
网络上关于如何本地调试nodejs应用的教程已经很多了,工具有Chrome开发者工具,Visual Studio Code,和nodejs周边的一些小工具等等. 在实际情况中,我们可能遇到本地运行良好 ...
- PHP中pdo的使用
<?php /** *下面代码中information为表名 * */ //1.先要连数据库 $pdo=new PDO('mysql:host=localhost;dbname=数据库名','用 ...
- sql server 防 注入
这里使用的是参数化 SqlParameter useremail = new SqlParameter("@useremail", user.user_Email); SqlPar ...
- Spring入门篇——第4章 Spring Bean装配(下)
第4章 Spring Bean装配(下) 介绍Bean的注解实现,Autowired注解说明,基于java的容器注解说明,以及Spring对JSR支持的说明 4-1 Spring Bean装配之Bea ...
- linux安装libreOffice
参考链接:https://qtdebug.com/mac-centos7-libreoffice/ https://blog.csdn.net/diyiday/article/details/7985 ...
- CentOS7下tftp服务安装配置
1.软件包安装 root用户或者普通用户使用sudo权限执行如下命令: yum install xinetd tftp tftp-server # root 用户执行 sudo yum install ...