欧拉函数

poj 3090
 这道题刚开始的思路是直接暴力,初始化全部为1,每多一个最外层时,判断最外层的每个点的横纵坐标分别除以里层每个点的横纵坐标,如果满足两横坐标与两纵坐标比值相等,则,标记为0。最后算出为1的个数。但是直接4层循环一定超时,所以放弃了。后来还是用暴力,稍微改了改思路,还是没有写出来。哎,等再改改着。
  后来师姐说直接用欧拉函数,欧拉函数是什么?

欧拉函数ϕ(n)是不超过n且和n互质的正整数的个数。

下面直观地看看欧拉函数:

n123456789101112131415
φ(n)11224264641041268

定理

  • 定理0 算术函数f如果满足对于任意两个互质的正整数m和n,均有f(mn)=f(m)f(n),就称f为积性函数(或乘性函数)。

如果对于任意两个正整数m和n,均有f(mn)=f(m)f(n),就称为完全积性函数。

  • 定理1 对于素数p,ϕ(p)=p−1。
  • 定理2 ϕ(pn)=pn−pn−1,因为素数幂pn不互质的只有p的倍数,一共有pn/p=pn−1个。
  • 定理3 若m、n互质,ϕ(mn)=ϕ(m)ϕ(n),所以欧拉函数是积性函数。

因为mn互质,和m互质的数乘上和n互质的数就会和mn互质。

  • 定理4 设n=p1a1p2a2...pkak为正整数n的素数幂分解,那么ϕ(n)=n(1−1/p1)(1−1/p2)...(1−1/pk)。

由定理2,ϕ(pn)=pn−pn−1=pn (1-1/p),又由定理3,ϕ(n)=p1a1p2a2...pkak(1−1/p1)(1−1/p2)...(1−1/pk)=n(1−1/p1)(1−1/p2)...(1−1/pk)

由定理4得到的代码如下:

int euler(int x){
    int res = x;
    for(int i=2; i*i<=x; i++)
        if(x % i == 0)

{      res = res / i * (i - 1);
         while(x % i == 0) x /= i;

  }

    if(x > 1) res = res / x * (x - 1);//防止溢出。
    return res;
}

(好长好长时间才差不多明白的一个算法,心塞啊)

认识了欧拉函数,与本题的关系在哪里,想啊想,怎么联系这个呢?思路受限制,怎么用怎么用??

最终还是躲不过看题解了。(水题)

  做法:所求个数等于由(0,0)点与其他两点所组三角形个数*2+1

三角形个数怎么求?

依次计算每层所增加符合题意的三角形个数,求和,即 依次求每多一层时,新增加的斜率的个数,而新增的斜率的个数正好是以该层边长为变量的欧拉函数的值。

So,代码如下:

int euler(int x){
    int res = x;
    for(int i=2; i*i<=x; i++)
        if(x % i == 0){
             res = res / i * (i - 1);
             while(x % i == 0) x /= i;
         }
    if(x > 1) res = res / x * (x - 1);
    return res;
}
int main()
{
    int C,N;
while (scanf("%d", &C) != EOF)
{


for (int i = 0; i < C; ++ i)
{
scanf("%d", &N);
int sum = 0;
for (int j = 1; j <= N ; ++ j )
{
sum += euler(j);
}
printf("%d %d %d\n", i + 1, N, 2 * sum + 1);
}
}
return 0;
}


(心情简单??!!!)

  poj  1284(理解原根)
原根是一种数学符号,设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根。(其中φ(m)表示m的 欧拉函数[1]  
假设一个数g是P的原根,那么g^i mod P的结果两两不同,且有 1<g<P,0<i<P,归根到底就是g^(P-1) = 1 (mod P)当且仅当指数为P-1的时候成立.(这里P是素数)。
简单来说,g^i mod p ≠ g^j mod p (p为素数),其中i≠j且i, j介于1至(p-1)之间,则g为p的原根。
求原根目前的做法只能是从2开始枚举,然后暴力判断g^(P-1) = 1 (mod P)是否当且仅当指数为P-1的时候成立。而由于原根一般都不大,所以可以暴力得到。
m= 7,则φ(7)等于6。
a= 2,由于2^3=8≡1(mod 7),2^6=64≡1(mod7),而2!=3,2^3≡2^6(mod7),所以 2 不是模 7 的一个原根。设 a= 3,由于3^1≡3(mod 7),3^2≡2(mod 7),3^3≡6(mod 7),3^4≡4(mod 7),3^5≡5(mod 7),3^6≡1(mod 7),所以 3 是模 7 的一个原根.
  关于性质暂时还理解不了,先记下两定理。
两个定理:
1)所有的奇素数都是有原根的
2)一个数n有原根,那么他有phi(phi(n))个模n不同余的原根(n是否素数都可用)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值