uva11426 gcd、欧拉函数
题意:给出N,求所有满足i<j<=N的gcd(i,j)之和
这题去年做过一次。。。
设f(n)=gcd(1,n)+gcd(2,n)+......+gcd(n-1,n),那么answer=S[N]=f(1)+f(2)+...+f(N)。
先求出每一个f(n)。
令g(n,i)=【满足gcd(x,n)=i且x<N的x的数量】,i是n的约数
那么f(n)=sigma【i*g(n,i)】 (i即gcd的值,g(n,i)为数量)
又注意到gcd(x,n)=i -> gcd(x/i,n/i)=1 -> x/i与n/i互质 -> 满足该条件的x/i有phi(n/i)个
那么再用欧拉函数就可以求出每一个f(n)啦~
如果找n的每一个约数i会有点慢,可以枚举i,令n=2*i,3*i,........(n是i的所有倍数且小于MAXN)
for (int i=1;i<=MX;i++)
for (int n=i*2;n<=MX;n+=i)
f[n]=f[n]+(i*phi[n/i]);
粗体部分的思想很常用,已加入数论模板豪华午餐╮(╯▽╰)╭
1 #include <stdio.h> 2 #include <string.h> 3 //using namespace std; 4 #define MX 4000005 5 #define LL long long 6 7 LL phi[MX],f[MX],S[MX]; 8 int N; 9 10 void calc_phi(int n) 11 { 12 for (int i=2;i<=n;i++) 13 phi[i]=0; 14 phi[1]=1; 15 for (int i=2;i<=n;i++) 16 if (!phi[i]) 17 for (int j=i;j<=n;j+=i) 18 { 19 if (!phi[j]) phi[j]=j; 20 phi[j]=phi[j]/i*(i-1); 21 } 22 } 23 24 int main() 25 { 26 calc_phi(MX); 27 28 memset(f,0,sizeof(f)); 29 for (int i=1;i<=MX;i++) 30 for (int n=i*2;n<=MX;n+=i) 31 f[n]=f[n]+(i*phi[n/i]); 32 33 S[2]=f[2]; 34 for (int i=3;i<=MX;i++) 35 S[i]=S[i-1]+f[i]; 36 37 while(~scanf("%d",&N)) 38 { 39 if (N==0) break; 40 printf("%lld\n",S[N]); 41 } 42 43 return 0; 44 }
posted on 2015-03-02 17:27 Pentium.Labs 阅读(144) 评论(0) 编辑 收藏 举报
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· .NET Core GC压缩(compact_phase)底层原理浅谈
· Winform-耗时操作导致界面渲染滞后
· Phi小模型开发教程:C#使用本地模型Phi视觉模型分析图像,实现图片分类、搜索等功能
· 语音处理 开源项目 EchoSharp