博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2480
阅读量:7101 次
发布时间:2019-06-28

本文共 2286 字,大约阅读时间需要 7 分钟。

题意:给出n(2^31),求∑gcd(i, n) 1<=i <=n。

分析:首先所有与n互质的数字x都满足gcd(x,n)=1。我们先计算这种等于1的情况,恰好是n的欧拉函数phi(n)。我们可以将上述情况视为跟n最大公约数为1的情况,现在我们将其推广至最大公约数为p的情况。对于对于所有满足gcd(x,n)=p(p为常数)的x,他们与n拥有相同的gcd,那么他们同时除以p之后,就会变得和n/p互质,这种数字x有phi(n/p)个,这些x的和为p*phi(n/p)个。所以我们要计算∑gcd(i, n) 1<=i <=n,只需要根据gcd的值不同,分类进行计算即可,总结成公式:∑p*phi(n/p)(p是n的约数)

对于这个公式我们有一个快速计算的方法,我们先想,若要计算∑p,我们可以用公式(x1^0+x1^1+...+x1^c1)*(x2^0+x2^1+...+x2^c2)*...*(xm^0+xm^1+...+xm^cm)。xi是n的质因数,ci是n中含有xi的个数。同理,根据欧拉函数的公式,每个欧拉函数值也和各个质因子有关,求∑phi(n/p)=∑phi(p)=(1 + x1^0 * (x1 - 1) + x1^1 * (x1- 1) + ...+x1^(c1-1) * (x1- 1))*...*(...)。然后由于二者都是质因子幂相乘的形式,所以可以把两者综合起来,对于每个括号里的每一项,都是约数因式和欧拉函数因式的乘积的形式,即p的因式要乘以phi(n/p)的因式,两因式的质因子指数是互补的,最终公式变为(x1^(c1-1)*(c1-1) + x1^c1)*...。

View Code
#include 
#include
#include
#include
#include
using namespace std;int n;bool is[(1 << 16) + 5];int prm[(1 << 16) + 5];int getprm(int n){ int i, j, k = 0; int s, e = (int) (sqrt(0.0 + n) + 1); memset(is, 1, sizeof(is)); prm[k++] = 2; is[0] = is[1] = 0; for (i = 4; i < n; i += 2) is[i] = 0; for (i = 3; i < e; i += 2) if (is[i]) { prm[k++] = i; for (s = i * 2, j = i * i; j < n; j += s) is[j] = 0; } for (; i < n; i += 2) if (is[i]) prm[k++] = i; return k;}long long power(int p, int cnt){ if (cnt < 0) return 1; long long ret = 1; long long temp = p; while (cnt) { if (cnt & 1) ret *= temp; cnt >>= 1; temp = temp * temp; } return ret;}long long cal(int p, int cnt){ return power(p, cnt - 1) * cnt * (p - 1) + power(p, cnt);}int main(){ //freopen("t.txt", "r", stdin); int m = getprm(1 << 16); long long ans; while (~scanf("%d", &n)) { ans = 1; for (int i = 0; i < m && prm[i] * prm[i] <= n; i++) { int cnt = 0; while (n % prm[i] == 0) { n /= prm[i]; cnt++; } ans *= cal(prm[i], cnt); } if (n != 1) ans *= cal(n, 1); printf("%lld\n", ans); } return 0;}

 

 

转载于:https://www.cnblogs.com/rainydays/archive/2012/10/30/2745672.html

你可能感兴趣的文章
20.3. mysqladmin - client for administering a MySQL server
查看>>
【Java学习笔记之三十二】浅谈Java中throw与throws的用法及异常抛出处理机制剖析...
查看>>
使用ASP.NET 2.0提供的WebResource管理资源
查看>>
Android中文API(96)——SoundEffectConstants
查看>>
JavaSE学习总结(六)——接口与抽象类
查看>>
Awesome Torch
查看>>
DEDECMS之三 首页、列表页怎么调用文章内容
查看>>
自己写一个网页版的Markdown实时编辑器
查看>>
68.6. snapshot backup
查看>>
Redis之高可用方案
查看>>
[20171208]rman与truncate3.txt
查看>>
SAP HUM MB1B + 311的操作把库存转入HUM管理的Storage Location
查看>>
SAP MM We Need Use MIGO+101 to conduct GR against a return purchase order.
查看>>
关于数据库无法登录的问题反思
查看>>
java性能优化方案9——优化自定义hasCode()方法和equals()方法
查看>>
Oracle 12c手工建库(非CDB及CDB创建)
查看>>
从头开始学JavaScript 笔记(一)——基础中的基础
查看>>
SQL Server里因丢失索引造成的死锁
查看>>
算法系列15天速成——第五天 五大经典查找【中】
查看>>
listener.ora中PLSExtPro 和ExtProc的作用(转)
查看>>