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 想法:我们再次 ...
随机推荐
- Django-djangorestframework-响应模块
响应模块 一般都用 Response 对象来做返回(最后一定是打包成符合 HTTP 协议的数据格式来传输,Response 类做了一系列处理,所以这里我们只需要关注下它的那些参数即可) 响应类构造器 ...
- MongoDB数据库、集合、文档的操作
MongoDB系列第一课:MongDB简介 MongoDB系列第二课:MongDB环境搭建 MongoDB系列第三课:MongDB用户管理 MongoDB系列第四课:MongoDB数据库.集合.文档的 ...
- 1.CentOS 7 vs CentOS 6的不同
CentOS 7 vs CentOS 6的不同(1)桌面系统[CentOS6] GNOME 2.x[CentOS7] GNOME 3.x(GNOME Shell) (2)文件系统[CentOS6] ...
- 怎样快捷获取元素节点body
1. 使用: document.body document.body.nodeName; // "BODY" 2. 使用: document.getElementsByTagNam ...
- java lesson09总结
package Super; public class SuperTest { String color; // public SuperTest(String color) {this.colo ...
- Advanced Installer 安装完成后,自动启动主程序。
这个耗时2天,才研究测试通过.一定要记住了方法: =========================================================================== ...
- 垃圾分类常见APP
垃圾分类指南app 上海就要实行垃圾分类了,垃圾分类指南app你需要吗,这里有相关的各种垃圾分类的介绍与上海垃圾分类投放指南,这里是垃圾分类指南手机入口能够让你更好的去完成垃圾分类呢.垃圾分类指 .. ...
- WinPE基础知识之重定位表
typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; // (重要)需要重定位的位置,这是一个RVA DWORD SizeOfBl ...
- 11.SpringMVC注解式开发-处理器方法的返回值
处理器方法的返回值 使用@Controller 注解的处理器的处理器方法,其返回值常用的有四种类型 1.ModelAndView 2.String 3.void 4.自定义类型对象 1.返回Model ...
- python 之禅 又名 蛇宗三字经
打开cmd 输入python回车 import this Beautiful is better than ugly. Explicit is better than implicit. Simple ...