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